反射机制(一)

来源:互联网 发布:查看淘宝店铺在线人数 编辑:程序博客网 时间:2024/05/18 00:52

定义

反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许其对内部成员进行操作。由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的灵活性,但是不恰当地使用反射机制,也会严重影响系统的性能。
具体而言,反射机制的主要功能主要有:①得到一个对象所属的类,②获取一个类的所有成员变量和方法,③在运行时创建对象,调用对象的方法。

反射机制的作用:
1,反编译:.class–>.java
2,通过反射机制访问java对象的属性,方法,构造方法等;

先看一下sun为我们提供了那些反射机制中的类:
java.lang.Class;
java.lang.reflect.Constructor; java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;

很多反射中的方法,属性等操作我们可以从这四个类中查询。还是哪句话要学着不断的查询API,那才是我们最好的老师。

Class c=Class.forName(“Employee”);
Object o=c.newInstance(); 调用了Employee的无参数构造方法

方法关键字
getDeclareMethods() 获得所有的方法
getReturnType() 获得方法的返回类型
getParameterTypes() 获得属性的传入参数类型

构造方法关键字
getDeclaredConstructors() 获得所有的构造方法
getDeclaredConstructor(参数类型.class,……) 获得特定的构造方法

父类和父接口
getSuperclass() 获取某类的父类
getInterfaces() 获取某类实现的接口
这样我们就可以获得类的各种内容,从而进行反编译
反射机制获取类的方法有三种,我们分别展示如何获取Reflection包下的Student类

Class.forName(“类的路径”)
Class Student = Class.forName(“Reflection.Student”); //包名+类名
类名.class
Class Student = Reflection.Student.class;
类实例.getClass()
Student student = new Student(); Class Student =student.getClass();

Class类中的6个重要方法
1.getName()方法,返回一个String字符串,显示该类的名称。
1.System.out.println(Student.getName()); //输出: Reflection.Student
2.newInstance()方法, 由类调用该方法,根据该类的默认构造函数创建类的实例
Object o = Student.newInstance();
3.getClassLoader()方法,返回该类对象的对应的加载器。

4.getComponentType()方法,返回类的组件类型的数组,如果这个类并不代表一个数组类,此方法返回null。
5.getSuperClass()方法,返回某子类所对应的直接父类所对应的Class对象。
6.isArray()方法,判定此Class对象所对应的是否是一个数组对象。

反射机制获取类的方法

获取类的构造方法
getDeclaredConstructors() //获取类的所有构造方法
getDeclaredConstructor(参数类型.class,……) //获取特定的构造方法

获取类的普通方法
getDeclaredMethods() //获取所有普通方法
getDeclaredMethod(“方法名”,参数类型.class,……) //获取指定名称的方法
getReturnType() //获取方法的返回类型
getParameterTypes() //获得方法的传入参数类型

new 创建对象,是静态加载类,在编译时刻就需要加载所有可能使用到的类

通过动态加载类可以解决该问题。通过类类型创建该类的对象
1、静态加载类,是编译时刻加载;动态加载类,是运行时刻加载
2、new创建对象:是静态加载类,在编译时刻就需要加载所有的【可能使用到的类】。有一个类有问题(如不存在),都不能通过编译,会报错。
3、Class.forName()通过动态加载类,可以用到一个类时,才进行加载。

难点:使用new和newInstance创建对象有什么区别?

首先一个是关键字,一个是方法…new是一个关键字,使用关键字来新建一个对象的时候没有过多的限制…而newInstance()是一个方法,使用newInstance()创建对象的时候,类一定要有一个默认的无参构造方法…并且这个类必须要被加载,否则的话JVM首先会将这个类进行加载后,然后我们才能使用newInstance()来新建一个对象…那么大家就会问了,那给出两个创建对象的方法,是不是有点多此一举了呢?这个当然是否定的…使用newInstance()…其实在一定情况下是很有好处的.

代码区:

public class ReflectDemo {    public ReflectDemo() {        Scanner cin = new Scanner(System.in);        System.out.println("请输入完整的路径:");        String classpath = cin.nextLine();// 表示输入完整的路径        try {            // 三种实现对象的实例化            Class cla = Class.forName(classpath);            /*             * Class cla_1=person.class; person p=new Person(); Class             * cla_2=p.getClass();             */            // 定义数组来保存类中的所有方法            Method method[] = cla.getDeclaredMethods();            System.out.println("======类中的方法有=======");            for (Method meth : method) {                System.out.println(meth.toString());            }            Field field[] = cla.getDeclaredFields();// 保存类中的所有属性            System.out.println("=====类中内部的属性=======");            for (Field fie : field) {                System.out.println(fie.toString());            }            System.out.println("========属性获取结束==========");            Constructor con[] = cla.getDeclaredConstructors();// 类中所有的构造函数            System.out.println("========获取构造函数=========");            for (Constructor c : con) {                System.out.println(c.toString());            }        } catch (Exception e) {            e.printStackTrace();            System.out.println("路径输入错误");        }    }

参考博客:
http://blog.csdn.net/albenxie/article/details/77434911
http://www.cnblogs.com/zhanglei93/p/5887801.html
http://blog.csdn.net/qq_27093465/article/details/52254924