什么是反射机制?
程序在运行的过程中,可以通过动态加载获取类的方法与成员。本质就是JAVA虚拟机获取class的对象 ,然后编译加载类获取类中的成员方法。
反射机制的原理:
因为java是先编译后运行的语言,所以类中的所有方法,所有属性成员都会存在于内存当中。
验证JAVA反射机制代码
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
/*
反射机制原理:对于任何一个类,都能知道类的成员方法与属性。
对于一个对象,也能知道对象中的所有方法。
核心:
因为java为先编译后运行的语言,所以在程序运行的时候我们就能从内存中读到方法,属性。
--JAVA中一切皆对象--
-constructor 建造者 构造函数
-declare 声明,宣告 所有的
-field 田野,领域 字段
-method 方法
*/
public class JAVA反射机制 {
public static void main(String[] args) throws ClassNotFoundException,
NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
//获取构造方法
testClassConstructor();
//获取字段
testClassField();
//获取方法
testClassMethod();
//测试类中的方法
testLogin();
//测试ArrayList的add方法
testArrayList();
}
static void testClassConstructor() throws ClassNotFoundException,
NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
/*
-通过反射机制
-获取构造函数
Author:DarkFire
*/
Class c1 = Class.forName("Student");
//输出公共的构造函数 构建 -- constructor
Constructor[] constructors = c1.getConstructors();
System.out.println("**************输出公有构造方法*************");
for(Constructor constructor:constructors){
System.out.println(constructor);
}
//获取所有的构造方法
constructors = c1.getDeclaredConstructors();
System.out.println("**************所有构造方法*************");
for (Constructor c:constructors) {
System.out.println(c);
}
//获取无参的构造函数
System.out.println("**************无参的构造函数*************");
Constructor c2 = c1.getConstructor(null);
System.out.println(c2.toString());
//获取对应参数的构造函数
System.out.println("**************执行对应参数的构造函数*************");
//String.class 表示形参为 string ,int.class 表示 int....
c2 = c1.getDeclaredConstructor(String.class);
System.out.println(c2);
// c2.setAccessible(true); //暴力访问(忽略掉访问修饰符) 突破私有权限
//开始实例化一个对象
Object obj =c2.newInstance("202010804069");
/*
*/
}
static void testClassField() throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class c1 = Class.forName("Student");
Field[] fields = c1.getFields();
//获取所有公有字段
System.out.println("**************获取公有字段*************");
for (Field f:fields ) {
System.out.println(f);
}
System.out.println("**************获取所有字段*************");
fields = c1.getDeclaredFields();
for (Field f:fields ) {
System.out.println(f);
}
System.out.println("**************通过实例化一个对象来修改他的属性*************");
Field field = c1.getField("name");
//先实例化出个对象
Student s1 =(Student) c1.getConstructor().newInstance();
s1.name = "姓名";
System.out.println(s1.name);
field.set(s1,"姓名_Modify");
System.out.println(s1.name);
}
static void testClassMethod() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
Class c1 = Class.forName("Student");
Method[] methods = c1.getMethods();
System.out.println("***********方法列表**************");
for(Method m:methods){
System.out.println(m);
}
Student s1 = (Student)c1.newInstance();
Method m2 = c1.getMethod("setName", String.class);
m2.invoke(s1,"刘德华");//调用setName方法,并设置参数
m2 = c1.getMethod("getName");
m2.invoke(s1);//调用getName方法
}
static void testLogin() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
Class c1 = Class.forName("Student");
Method m1 = c1.getDeclaredMethod("login", String.class, String.class);
m1.setAccessible(true);
Object obj = c1.newInstance();
m1.invoke(obj,"测试","123456");
}
static void testArrayList() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
Class c1 = Class.forName("java.util.ArrayList");
Object obj = c1.newInstance();
Method m1 = c1.getMethod("add", Object.class);
m1.invoke(obj,"测试数据一");
m1.invoke(obj,"测试数据二");
Method m2 = c1.getMethod("get", int.class);
System.out.println(m2.invoke(obj,0));
}
}
class Student{
public String name;
int age;
String sno;
//默认构造
public Student(){
}
//公共构造
public Student(String sno){
this.sno=sno;
System.out.println("学号= "+sno);
}
//公共方法
public String getName(){
System.out.println("成功调用getName方法:"+name);
return name;
}
public void setName(String name){
this.name = name;
}
//受保护的构造方法
protected Student(int age){
this.age = age;
System.out.println("age = "+age);
}
//私有的构造方法
private Student(String name,int age){
this.age =age;
this.name=name;
System.out.println("姓名:"+name+",age = "+age);
}
private void login(String name,String sno){
this.name = "测试";
this.sno = "123456";
if (this.name.equals(name)&&this.sno.equals(sno)){
System.out.println("验证成功,姓名学号正确!");
}
}
}
运行结果