/**
 *  测试反射机制 
 */import java.lang.reflect.Field;
import java.lang.reflect.Method;public class TestReflect { int f(Object o) throws Exception {
int length = 0;
/* 得到类对象 ,并取得方法 */
Class c = o.getClass();
Object oo = c.newInstance();
Method method = c.getMethod("length", new Class[] {int.class });
method.setAccessible(true);
Object len = method.invoke(oo,
new Object[]{ new Integer(5) });// 利用方法,并调用方法

length = ((Integer)len).intValue();// 软件成整型 return length; }  static class Test {
public int length(int i) {
return i * i;
}
} public static void main(String[] args) throws Exception { int len = new TestReflect().f(new Test()); System.out.println(" length长度:" + len);
}}
也就是说static class Test {
public int length(int i) {
return i * i;
}
改成private class Test{
......
}
将无法成功,将报错,我应该如何修改,谢谢!

解决方案 »

  1.   

    package squall.test;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;public class TestReflect
    { int f(Object o) throws Exception
    {
    int length = 0;
    /* 得到类对象 ,并取得方法 */
    Class c = o.getClass();
    Constructor con = c.getDeclaredConstructor();
    con.setAccessible(true);

    Object oo = con.newInstance();
    //c.newInstance();
    Method method = c.getMethod("length", new Class[] { int.class });
    method.setAccessible(true);
    Object len = method.invoke(oo, new Object[] { new Integer(5) });// 利用方法,并调用方法 length = ((Integer) len).intValue();// 软件成整型 return length; } private static class Test
    {
    public int length(int i)
    {
    return i * i;
    }
    } public static void main(String[] args) throws Exception
    { int len = new TestReflect().f(new Test()); System.out.println(" length长度:" + len);
    }}
      

  2.   

    lz的程序主要是如果你改成private的话,你就不能调用显示调用new Test()了
      

  3.   

    Exception in thread "main" java.lang.IllegalAccessException: Class com.songbx.test.TestReflect can not access a member of class com.songbx.test.TestReflect$Test with modifiers "private"
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
    at java.lang.Class.newInstance0(Class.java:349)
    at java.lang.Class.newInstance(Class.java:308)
    at com.songbx.test.TestReflect.f(TestReflect.java:12)
    at com.songbx.test.TestReflect.main(TestReflect.java:31)应该是2楼说的问题
      

  4.   

    构造成员内部类和静态内部类不一样,成员内部类需要外部类的对象 
    [code=Java]
    int f() throws Exception
        {
            int length = 0;
            /* 得到类对象 ,并取得方法 */
            Class c = getClass();
            Object o1=c.newInstance();
            
            Class[] ss = c.getDeclaredClasses();
            
            for (Class s : ss)
            {
                    
                    Constructor con = s.getDeclaredConstructor(new Class[]{c});
                    
                    Object inner = con.newInstance(o1);
                    
                    Method method = s.getMethod("length", new Class[] { int.class });
                  
                   
                    Object len = method.invoke(inner, new Object[] { new Integer(10) });// 利用方法,并调用方法
                   
                    length = ((Integer) len).intValue();// 软件成整型
                                   
            }
            
            return length;
    }code]