欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!
反射机制的含义及其功能
 
含义:
 
反射是被视为动态语言的关键,反射机制能够让程序在执行期间借助Reflection API获取任何类的内部信息,并能直接操作任意对象的内部属性和方法
 
功能:
 
在运行时判断任意一个对象所属的类
 
在运行时构造任意一个类的对象
 
在运行时判断任意一个类所具有的成员变量和方法
 
在运行时调用一个对象的成员变量和方法
 
生成动态代理
 
处理流程图
 
反射相关API
 
java.lang.Class : 代表一个类
 
java.lang.reflect.Method: 代表类的方法
 
java.lang.reflect.Field: 代表类的成员变量
 
java.lang.reflect.Constuctor: 代表类的构造方法
 
Class类
 
反射可以得到的信息: 某个类的属性,方法和构造器,某个类到底实现了哪些接口。
 
对于每个类而言,JRE都为其保留一个不变的Class对象,
 
一个Class对象包含了特定某个类的相关信息
 
Class本身也是一个类
 
Class对象只能由系统建立对象
 
一个类在JVM中只会有一个实例
 
一个Class对象对应的是一个加载到JVM中的一个。class文件(每个类在编译后会生成一个。class文件)
 
每个类的实例都会记得自己是由哪个Class实例生成的
 
通过Class可以完整得到一个类中的完整结构
 
获取class对象的方式
 
1.class.forName(“全类名”): 将字节码文件加载进内存,返回class对象
 
多用于配置文件,将类名定义在配置文件中。 读取文件,加载类
 
全类名: 包名。类名
 
会抛出ClassNotFoundException的异常
 
2.类名。class: 通过类名的属性class获取
 
多用于参数传递
 
3.对象。getClass(): getClass()方法在Object类中定义
 
多用于对象的获取字节码的方式
 
注意
 
同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪种方式获取的class对象都是同一个
 
演示
 
package test;
 
public class main1 {
 
    public static void main(String[] args) throws Exception {
 
        //1.类全名
 
       Class cls1= Class.forName("test.main1");
 
        System.out.println(cls1);
 
        //类名。class
 
        Class cls2=main1.class;
 
        System.out.println(cls2);
 
        //对象。getClass()
 
        main1 m=new main1();
 
        Class cls3=m.getClass();
 
        System.out.println(cls3);
 
              //比较这三个对象
 
        System.out.println(cls1==cls2);
 
        System.out.println(cls1==cls3);
 
        System.out.println(cls2==cls2);
 
    }
 
}
 
获取一个类的父类和接口
 
package reflect;
 
public class main {
 
    public static void main(String[] args) throws Exception {
 
    Class cl1=Class.forName("reflect.stu");//获取指定类的Class实例
 
        System.out.println(cl1.getName());
 
    Class cl2=cl1.getSuperclass();//获取父类
 
        System.out.println(cl2.getName());
 
        //获取当前类的所有接口
 
        Class[] interfaces=cl1.getInterfaces();
 
        for(Class c:interfaces)
 
            System.out.println(c.getName());
 
    }
 
}
 
获取一个类的构造方法
 
         //获取当前类的共有构造方法
 
        Constructor[] con=cl1.getConstructors();
 
        for(Constructor c:con)
 
        {
 
            //getModifiers():  获取构造方法修饰符  返回1代表public 返回2代表private
 
            //getName(): 获取方法名称
 
            System.out.println("修饰符:"+c.getModifiers()+"  构造方法:"+c.getName());
 
            //获取构造函数的参数,参数有几个数组里面元素就有几个
 
            Class[] paramClass=c.getParameterTypes();
 
           for(Class c1:paramClass)
 
           {
 
               System.out.println("构造方法: "+c.getName()+ "  参数类型: "+c1.getName());
 
           }
 
        }
 
        System.out.println("--------------------------------------------------------");
 
        //获取当前类的所有构造方法,包括共有和私有构造方法
 
        Constructor[] con1=cl1.getDeclaredConstructors();
 
        for(Constructor c:con1)
 
        {
 
            //getModifiers():  获取构造方法修饰符  返回1代表public 返回2代表private
 
            System.out.println("修饰符: "+c.getModifiers()+"  构造方法:"+c.getName());
 
            Class[] paramClass=c.getParameterTypes();
 
            for(Class c1:paramClass)
 
            {
 
                System.out.println("构造方法: "+c.getName()+ "  参数类型: "+c1.getName());
 
            }
 
        }

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h64982.shtml