不同的包只有子类才能访问,所以,所以你的类不是继承该protected属性的父类,如果该父类有公开构造方法,可以通过匿名子类来访问,如果没有公开构造方法,可以通过反射来访问 如 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) { } } }
Method method = clazz.getDeclaredMethod("test",new Class[0]);//无参数方法test
method.setAccessible(true);
Object returnValue = method.invoke(clazz.newInstance(),new Object[0]);
如
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) { }
}
}