日期:2014-05-20  浏览次数:20667 次

java中protected使用问题
protected修饰的方法属性不在同一个包中是如何访问的?给个例子说明下

------解决方案--------------------
Java code
        Class clazz = Test.class;
        Method method = clazz.getDeclaredMethod("test",new Class[0]);//无参数方法test
        method.setAccessible(true);
        Object returnValue = method.invoke(clazz.newInstance(),new Object[0]);

------解决方案--------------------
不同的包只有子类才能访问,所以,所以你的类不是继承该protected属性的父类,如果该父类有公开构造方法,可以通过匿名子类来访问,如果没有公开构造方法,可以通过反射来访问

Java code
package a;
class A {
    protected void testa() {
        System.out.println("A");
    }
}

package b;
class B extends A {
    public void testb() {
        testa(); //子类可以直接访问
    }
}

package c;
class C {
    public void testc() {
        new A() { //匿名子类访问
            {testa();}
        };
    }
}

package d;
class D {
    public void testd() {
        try {
            A a = new A();
            Class<?> c = A.class();
            Method m = c.getDeclaredMethod("testa"); //反射访问
            m.setAccessible(true);
            m.invoke(a);
        } catch (Throwable e) {

        }
    }
}