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

解决方案 »

  1.   

    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]);
      

  2.   

    不同的包只有子类才能访问,所以,所以你的类不是继承该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) {        }
        }
    }