一、反射是什么,有什么作用?
反射—在程序运行的过程中,我们可以得到某个类的对象,可以调用某个类中的任何一个变量/方法,这种动态获取信息的过程就是反射。
当我们在没有见过某个类的情况下,仅凭一个完整的类名,就可以获取到整个类的所有信息。
反射的使用场景:
1、jdbc加载数据库驱动
2、Servlet的web.xml配置
3、Spring框架
二、实例对象与反射对象的相互转换?
实例对象-----就是我们通过类创建的对象
反射对象-----通过反射机制得到的类对象
例如: 反射就是一面镜子,镜子前面的你就是实例对象,通过镜子得到的镜子里面的你就是反射对象。
反射对象是一个Class类型的对象
Class—不是创建类的关键字,表示一个类,所以反射对象是一个Class类型的对象
public final class Class
- 通过实例对象得到反射对象
package com.wangxing.test1;
public class TestMain {
public static void main(String[] args) {
//1.通过实例对象得到反射对象
Student stu1=new Student();
//通过实例对象的getClass()得到,当前实例对象对应的反射对象
Class stuclass=stu1.getClass();
//当我们没有实例对象时,我们可以用过类名【包名+类名】得到这个类的反射对象
//通过Class类的forname(类名【包名+类名】)
try {
Class stu1class=Class.forName("com.wangxing.test1.Student");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
- 通过反射对象得到实例对象
try {
Class stu1class=Class.forName("com.wangxing.test1.Student");
Student stu2=(Student)stu1class.newInstance();
stu2.info();
} catch (Exception e) {
e.printStackTrace();
}
三、通过反射对象得到构造方法\成员变量\成员方法
Constructor<?>[] | getConstructors() 得到构造方法 |
---|---|
Field[] | getDeclaredFields() 得到成员变量 |
Method[] | getDeclaredMethods() 得到成员方法 |
Class<?>[] | getInterfaces() 得到接口 |
Class<? super T> | getSuperclass() 得到父类 |
Package | getPackage() 得到包对象 |
int | getModifiers() Java语言修饰符 Modifier的toString(int mod) |
String | getName() 得到类名称 |
四、反射的应用
package com.wangxing.test1;
public interface MyInterFace {
}
package com.wangxing.test1;
public class Person {
}
package com.wangxing.test1;
public class Student extends Person implements MyInterFace {
public Student() {}
private String name="zhangsan";
public void info() {
System.out.println("Student类的实例方法");
}
}
package com.wangxing.test1;
public class TestMain {
public static void main(String[] args) {
//1.通过实例对象得到反射对象
Student stu1=new Student();
//通过实例对象的getClass()得到,当前实例对象对应的反射对象
Class stuclass=stu1.getClass();
//当我们没有实例对象时,我们可以用过类名【包名+类名】得到这个类的反射对象
//通过Class类的forname(类名【包名+类名】)
try {
Class stu1class=Class.forName("com.wangxing.test1.Student");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//2.通过反射对象得到实例对象
try {
Class stu1class=Class.forName("com.wangxing.test1.Student");
Student stu2=(Student)stu1class.newInstance();
stu2.info();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.wangxing.test2;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class TestMain {
public static String getMyName(String name) {
String newname="";
int dianindex=name.lastIndexOf(".");
newname=name.substring(dianindex+1);
return newname;
}
public static void main(String[] args)throws Exception {
String stuname="com.wangxing.test1.Student";
Class stuclass=Class.forName(stuname);
//得到类的包名称
String packagenamre=stuclass.getPackage().getName();
System.out.println("package "+packagenamre+";");
//得到类的修饰符
String classxiushifu=Modifier.toString(stuclass.getModifiers());
//得到类名
String stuclassname=getMyName(stuclass.getName());
//得到父类的名称
String stusuperclassname=getMyName(stuclass.getSuperclass().getName());
//得到接口名称
String interfaceName=getMyName(stuclass.getInterfaces()[0].getName());
System.out.println(classxiushifu+" class "+stuclassname+" extends "+
stusuperclassname+" implements "+interfaceName+"{");
//得到构造方法
Constructor gouzaofangfa=stuclass.getConstructors()[0];
//得到构造方法的修饰符
String gouzaoxiushifu=Modifier.toString(gouzaofangfa.getModifiers());
String gouzaoName=getMyName(gouzaofangfa.getName());
System.out.println("\t"+gouzaoxiushifu+" "+gouzaoName+"(){}");
//得到成员变量
Field bianliang=stuclass.getDeclaredFields()[0];
String bianliangxiushifu=Modifier.toString(bianliang.getModifiers());
String bianliangtype=getMyName(bianliang.getType().getName());
String bianliangname=bianliang.getName();
System.out.println("\t"+bianliangxiushifu+" "+
bianliangtype+" "+bianliangname+"=\"zhangsan\";");
//得到方法
Method fangfa=stuclass.getDeclaredMethods()[0];
String fangfaxiushifu=Modifier.toString(fangfa.getModifiers());
String fangfareturntype=getMyName(fangfa.getReturnType().getName());
String fangfaname=fangfa.getName();
//fangfa.getParameters() 得到方法参数
//fangfa.getExceptionTypes() 得到方法的声明抛出的异常类型
System.out.println("\t"+fangfaxiushifu+" "+
fangfareturntype+" "+fangfaname+"(){");
System.out.println("\t\tSystem.out.println(\"Student类的实例方法\")");
System.out.println("\t\t}");
System.out.println("}");
}
}
运行结果: