就是将一个匿名的类的实例做为参数传递到另一个类方法中,
这样如果两个类不再同一个包下面,就会出现IllegalAccessException,
说部清,还是先看下面三个示例吧!,在下面三个类中,代码一的类TestReflect 和代码三的类Testtt 是一样的,只是所在的包不同,代码二的类Rft 和代码一的类TestReflect 同包,类TestReflect 的main方法可以顺利执行完成,但类Testtt 则出现IllegalAccessException异常,
如果将类TestReflect 中的匿名类的getName方法,改为protected访问权限则NoSuchMethodException
现在的问题是:1、我如何只修改匿名类使得类Testtt 的main方法可以顺利执行,
2、匿名类的方法的访问权限public好像变成了protected,而其他的都变成了private,这个是什么原因?
代码一类TestReflect (这个类能正常执行)package com.test;public class TestReflect {
    public TestReflect() {
    }    public String getA(){
        Rft rft = new Rft();
        return rft.getPama(new Object(){String name = "dddd";
            public String getName(){return name;}},
                "name").toString();
    }    public static void main(String[] args){
        TestReflect test = new TestReflect();
        System.out.print(test.getA());
    }
}
代码二package com.test;import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;public class Rft {
    public Rft() {
    }    public Object getPama(Object o,String field){
        Object r = null;
        Class c = o.getClass();
        Field[] fs = c.getFields();
        Method[] ms = c.getMethods();
        Method m;
        try {
            m = c.getMethod("getName");
            r = m.invoke(o,null);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (InvocationTargetException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (IllegalAccessException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        return r;
    }
}代码三Testtt (这个代码会抛出异常IllegalAccessException)package com.test2;import com.test.Rft;public class Testtt {
        public String getA(){
        Rft rft = new Rft();
        return rft.getPama(new Object(){String name = "dddd";
            public String getName(){return name;}},
                "name").toString();
    }    public static void main(String[] args){
        Testtt test = new Testtt();
        System.out.print(test.getA());
    }
}

解决方案 »

  1.   

    不好意思,代码二中的getPama方法的参数field和变量fs和ms都没有用到,可以不必理会。
      

  2.   

    因为匿名内部类的类访问权限只是同一个包下能访问,代码3只有这样修改才行。package com.test2;import com.test.Rft;public class Testtt
    {
        
        public String getA()
        {
            Rft rft = new Rft();
            return rft.getPama(new TestInner(), "name").toString();
        }
        
        public static void main(String[] args)
        {
            Testtt test = new Testtt();
            System.out.print(test.getA());
        }
        
        public class TestInner
        {
            String name = "dddd";
            
            public String getName()
            {
                return name;
            }
        }
    }
      

  3.   

    不结贴怎么给分啊,csdn做的太不友好了,找半天都找不到怎么操作。