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()


            


    }

}