一、概述:
反射就是把一个JAVA类中的各种成分映射成相应的JAVA类;包括成员变量(Field),方法Method,构造方法(Constructor),修饰符,包Package等信息;
二、
9个预定义的Class对象:8个基本数据类型 + void
三、获取类实力对象的三种常用方法:
①类名.class
②对象名.getClass()
③Class的静态方法forName(String className)
示例:
public class 获取Class类的三种方法 {
public static void main(String[] args) throws Exception{
//第一种方法:
Class c1=Class.forName("Date");
//c1引用保存内存地址指向堆内存中的对象,该对象代表的是被反射的整个类
//第二中方式
//每个类型都有class属性
Class c2=Employ.class;
//第三种方式
//java中任何一个java对象都有getClass方法
Employ e=new Employ();
Class c3=e.getClass();
}
}
四、反射中的几个类
Class类:代表一个类。
File类:代表类的成员变量(成员变量也成为类的属性)
Method类:代表类的方法。
Construtor类:代表类的构造方法
Arry类:提供了动态创建数组,以及访问数组的元素的静态方法。
五、反射的应用(IO+properties+reflect)
1、创建properties文件classInfo.properties
className=User
2、创建User类并编译
public class User {
}
3、通过反射动态获取动态加载Usr类
import java.util.Properties;
import java.io.*;
public class IO2ProReflect {
//1、创建属性对象
Properties p=new Properties();
//2、创建流对象
FileReader fr=new FileReader("classInfo.properties");
//3、加载
p.load(fr);
//4、关闭流
fr.close();
//通过key获取value
String className=p.getProperty("className");
//通过反射机制创建对象
Class c=Class.forName(className);
//创建对象
Object o=c.newInstance();
System.out.println(o);
}
通过反射方式比较通过User u=new User();创建对象,更加灵活。
将类名写在配置文件中,通过改动配置文件,改变要加载的对象。
六、通过反射获取构造方法
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
public class ReflectTest8 {
public static void main(String[] args)throws Exception{
//获取类
Class c=Class.forName("java.lang.String");
//获取所有的构造方法
Constructor[] cs=c.getDeclaredConstructors();
for(Constructor con:cs){
//获取修饰符
System.out.println(Modifier.toString(con.getModifiers()));
//获取构造函数名
System.out.println(c.getName());
//构造方法的形式参数列表
Class[] parameterTypes=con.getParameterTypes();
for(Class parameterType:parameterTypes){
System.out.println(parameterType.getSimpleName());
}
}
}
}
反编译:
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
public class ReflectTest9 {
public static void main(String[] args)throws Exception{
//获取类
Class c=Class.forName("java.lang.String");
//获取所有的构造方法
Constructor[] cs=c.getDeclaredConstructors();
//反编译
StringBuffer sb=new StringBuffer();
sb.append(Modifier.toString(c.getModifiers())+" class "+c.getSimpleName()+"{\n");
//构造方法
for(Constructor con:cs){
sb.append("\t");
sb.append(Modifier.toString(con.getModifiers())+" ");
sb.append(c.getSimpleName()+"{");
//形参
Class[] parameterTypes=con.getParameterTypes();
for(int i=0;i<parameterTypes.length;i++){
Class parameterType=parameterTypes[i];
if(i==parameterTypes.length-1){
sb.append(parameterType.getSimpleName());
}else{
sb.append(parameterType.getSimpleName()+",");
}
}
sb.append("){}\n");
}
sb.append("}");
System.out.println(sb);
}
}
打印结果:
六、总结
java中反射是一种强大的工具,它能够创建灵活的代码,降低代码耦合度,这些代码可以在运行时装配,无需在组件之间进行源代码连接。
反射允许我们在编写和执行时,使我们的程序代码能够接入装载到JVM的内部信息,而不是源代码中选定的类写作的代码。