标签:反射中的内部类
JAVA内部类的反射应用
反射:可以理解为因为java文件都是需要加载到JVM中,然后由JVM根据需要去调用编译后的class文件,每个class文件都对应一个Class对象。换句话说,我们可以动态的在运行的程序中根据Class对象去获得它所有的方法,类,对象,属性等。
我们知道,类是由类名去声明,包含成员方法,成员属性,构造方法,而处处是对象的概念,类的成员方法由Method,成员属性由Field,构造方法由Constructor来分别表示。
例如:
public class Demo{
//成员属性
public int age;
private String name;
//构造方法
public Demo(){}
private Demo(String name.int age){
this.age=age;
this.name=name;
}
//成员方法
public void setAge(int age){
this.age=age;
}
private String getName(){
return this.name;
}
//内部类
class Demointo{
private String name;
Demointo(){}
private Demointo(String name){
this.name=name;
System.out.println(this.name);
}
}
public static void main(String[] args){
Class demo=Class.forName("Demo");//这里要注意输入类的全称,带包名,否则找不到
//注意getDeclaredConstructor用来获得private,public,protected的构造方法。
Constructor con=demo.getDeclaredConstrutor(String.class,int.class);
//注意如果是内部类的话,类名是外部类$内部类名 (可以写个带内部类的去编译运行下,然后找到class文件,看看它的名称)
Class demointo=Class.forName("Demo$Demointo");
//获得内部类的构造方法对象,因为内部类的实例是需要先实例外部类的,所以必须带上外部类的实例
Construtor con1=demointo.getDeclaredConstructor(Class.forName("Demo"),String.class);//断点1
//获得内部类的对象
Object obj=con1.newInstance(demo.newInstance,"ceshi");
---------------------------
输出:ceshi
总结:也就是说当我们去需要得到内部类的对象时,必须跟上外部类的对象,也和我们不用反射时的语法一样,内部类 内部类名=new 外部类(参数).new 内部类(参数);
其实在断点1这里只需要是外部类的Class对象就行,也可以直接写Demo.class或者demo.newInstance().getClass()
}
}
标签:反射中的内部类
原文地址:http://20150523.blog.51cto.com/10261028/1655929