修改完后对内部类的反射,你仔细看看吧!其中已做了注释
package cn.liu.javaenhance;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectInner {
public static void main(String[] args)throws Exception {
//获得Outer1类的构造函数
Constructor[] constructors=Outer1.class.getConstructors();
System.out.println(constructors.length);
//遍历得到的constructors数组
for(Constructor constructor:constructors){
//获取Outer1类的方法
Method[] methods=Outer1.class.getMethods();
//遍历得到的methods数组
for(Method method:methods){
if(method.getName()=="method"){
System.out.println(constructor.getName());
Outer1 out=(Outer1)constructor.newInstance();
//这个方法返回一个内部类对象,之前你的Outer1类中的method方法是没有返回对象的。
//下边的methodSetX。invoke(obj,8);obj为null。所以程序报空指针异常
Object obj=method.invoke(out);
System.out.println(method.getName());
String propertyName = "x";
//根据获得的内部类对象获取关于X的属性描述符对象
PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,obj.getClass());
//获得setX()方法对象
Method methodSetX = pd2.getWriteMethod();
System.out.println(methodSetX.getName());
methodSetX.invoke(obj,8);//调用Inner类的setX()方法。
System.out.println(pd2.getReadMethod().invoke(obj));//打印内部类变量x设置后的值。
}
}
}}
}
//-----------------------------------------------------------------------------------------------------
package cn.liu.javaenhance;
class Outer1
{
public Outer1(){}
private int x = 3;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
class Inner//内部类
{
private int x=1;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public void function()
{
//int x = 6;
System.out.println("innner :"+this.x);
}
}
/**/
public Inner method()//此方法应该返回一个内部类对象
{
//Inner in = new Inner();//这种写法只能在本类中使用,在其他类中无法访问,因为不知道这个内部类在哪个外部类中。所以无法访问
Outer1.Inner in = new Outer1().new Inner();//这种写法是在其他类中调用Outer1中Inner类的对象
return in;
//in.function();
}
} |