JAVA 反射常用的三种机制

来源:互联网 发布:网络接口怎么接线 编辑:程序博客网 时间:2024/06/17 15:11

1.概念

主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!

2.作用

(1)反编译 : .class 到 .java
(2)通过反射机制访问java对象的属性、方法等。

3.常用API

java.lang.Class;
java.lang.reflect.Constructor; java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;

4.具体实现

(1)反射机制获取类的方法有三种:

//第一种
Class c1 = Class.forName(“Employee”);
//第二种
Class c2 = Employee.class;
//第三种
Employee e = new Employee();
Class c3 = e.getClass();

(2)创建对象,获取类以后通过newInstance()来创建对象。

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

(3)获取属性:分为所有的属性和指定的属性。
a.获取所有属性的写法:

//获取整个类
Class c = Class.forName(“Employee”);
//获取所有的属性
Field []fs = c.getDeclaredFields();
//定义可变长度的字符串
StringBuffer sb = new StringBuffer();
//通过追加的方法,将每个属性拼接到字符串中
sb.append(Modifier.toString(c.getModifiers())+”class”+c.getSimpleName()+”({\n)”);
//里面的每一个属性
for(Field field : fs){
sb.append(“\t”);
//获得属性的修饰符
sb.append(Modifier.toString(field.getModifiers())+” “);
//获取属性类型
sb.append(field.getType().getSimpleName()+” “);
sb.append(field.getName()+”;\n”);
}
sb.append(“}”);
System.out.println(sb);

b.获取特定的属性的写法:对比传统的写法

public static void main(String []args)throws Exception{
//以前的写法
/*
User u = new User();
u.age = 12;
System.out.println(u.age);
*/
//反射的写法
Class c = Class.forName(“User”);
Object o = c.newInstance();

 Field idF = c.getDeclaredField("id"); idF.setAccessible(true); idF.set(o,"110"); System.out.println(idF.get(0));

}

5.获取方法和构造方法

方法关键字
含义
getDeclaredMethods()
获取所有的方法
getReturnType()
获得方法的放回类型
getParameterTypes()
获得方法的传入参数类型
getDeclaredMethod(“方法名”,参数类型.class,……)
获得特定的方法

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

父类和父接口
含义
getSuperclass()
获取某类的父类
getInterfaces()
获取某类实现的接口

6.反射加载配置文件,使我们的程序更加灵活

在设计模式的学习当中,学习抽象工厂的时候,就用到了反射机制加载读取数据库文件的字符串.
综上为,JAVA反射的再次学习,灵活的运用它,能够使我们的代码更加灵活,但是它也有它的缺点,就是运用它会使我们的软件的性能降低,复杂度增加,所以还要我们慎重的使用它。