一,什么是反射机制
🐅:Java反射机制是在运行状态中,对任意一个类,都能够知道这个类的所有属性的方法;对任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
🐅:Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。
二,常用的反射类
Java.lang.Class;
Java.lang.reflect.Constructor;
Java.lang.reflect.Field;
Java.lang.reflect.Method;
Java.lang.reflect.Modifier;
三,获取Class对象的三种方式
User user = new User("彭某人",22);
//,首先实例化对象,通过实例对象调用.getClass()方法获取
Class class1=user.getClass();
//直接通过类获取
Class class2=User.class;
Class class3=Class.forName("[包全限定名].User");
四,反射类的使用
Constructor:
// getDeclaredConstructor()方法会根据他的参数对该类的构造函数进行搜索并返回对应的构造函数
//没有参数就返回该类的无参构造函数,然后再通过newInstance进行实例化.
Object object = class3.getDeclaredConstructor().newInstance();
//class.newInstance()会直接调用该类的无参构造函数进行实例化,1.9已被弃用
Object object = class3.newInstance();
Field:
//获取所有属性,并展示属性
Field[] fields = class3.getDeclaredFields();
for (Field field :fields){
System.out.println(field.getType()+"--"+field.getName());
}
fieldss[1].set(user,100);
fieldss[0].set(user,"李四");
//获取某一个属性
Field field =class3.getDeclaredField("name");
//判断属性权限 isAccessible()过时了
//好像在JDK9中使用canAccess(Object) 我们还用这个
if (!field.isAccessible()){
field.setAccessible(true);
//将此对象的 accessible 标志设置为指示的布尔值。
//值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
//值为 false 则指示反射的对象应该实施 Java 语言访问检查
}
User user1 = (User) class3.getDeclaredConstructor().newInstance();
field.set(user1,"大佬");
Object obeject = field.get(user1);
System.out.println(field.getName()+"="+obeject);
Method:
//获取类的所有方法信息
Object obj = class3.getDeclaredConstructor().newInstance();
Method[] methods = class3.getDeclaredMethods();
for (Method method: methods){
System.out.println(method.getName()+"-"+method.getGenericReturnType().getTypeName());
}
//验证
Object obj1 = class3.getDeclaredConstructor().newInstance();
Method method= class3.getDeclaredMethod("setName", String.class);
method.invoke(obj1,"哈哈哈");
Method name = class3.getDeclaredMethod("getName");
Object nameobj = name.invoke(obj1);
System.out.println("修改后的name值"+nameobj);
Modifier:
//序列化输出所有属性信息
for (Field f :fieldss){
System.out.println(Modifier.toString(f.getModifiers())+","+f.getName()+","+f.getType());
}
//序列化输出所有方法信息
for (Method method :methods){
System.out.println(Modifier.toString(method.getModifiers())+","+method.getName()+","+method.getGenericReturnType());
}
五:demo
User:
package com.company;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class User {
private String name;
private int age;
public void sayhello(){
System.out.println(name+"今年"+age+"岁");
}
public void say(String methodstr,User user) throws SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException {
String vars = "say" + methodstr;
Method method = this.getClass().getDeclaredMethod("setName", String.class);
// Method method1 = this.getClass().getDeclaredMethod("sayhello");
// method1.invoke(this,new Object[]{user.getName(),user.getAge()});
method.invoke(this,"jjjjjjj");
}
public void study(){
System.out.println("没有参数!!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
Main:
package com.company;
import java.lang.reflect.*;
import java.util.logging.FileHandler;
public class Main {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, InstantiationException, NoSuchFieldException {
User user = new User("彭世友",22);
//获取类的三种方式
Class class1 = user.getClass();
Class class2 = User.class;
System.out.println(class1==class2);
Class class3= Class.forName("com.company.User");
//getDeclaredConstructor()方法会根据他的参数对该类的构造函数进行搜索并返回对应的构造函数,没有参数就返回该类的无参构造函数,然后再通过newInstance进行实例化.
//
Object object = class3.getDeclaredConstructor().newInstance();
System.out.println(class3 ==class2);
Field[] fields = class3.getDeclaredFields();
for (Field field :fields){
System.out.println(field.getType()+"--"+field.getName());
}
Field field =class3.getDeclaredField("name");
if (!field.isAccessible()){
field.setAccessible(true);
}
User user1 = (User) class3.getDeclaredConstructor().newInstance();
field.set(user1,"大佬");
Object obeject = field.get(user1);
System.out.println(field.getName()+"="+obeject);
Class class4 = Class.forName("com.company.User");
Object obj = class4.getDeclaredConstructor().newInstance();
Method[] methods = class4.getDeclaredMethods();
for (Method method :methods){
System.out.println(Modifier.toString(method.getModifiers())+","+method.getName()+","+method.getGenericReturnType());
}
// for (Method method: methods){
// System.out.println(method.getName()+"-"+method.getGenericReturnType().getTypeName());
// }
Object obj1 = class4.getDeclaredConstructor().newInstance();
Method method= class4.getDeclaredMethod("setName", String.class);
method.invoke(obj1,"等哈");
Method name = class4.getDeclaredMethod("getName");
Object nameobj = name.invoke(obj1);
System.out.println("修改后的name值"+nameobj);
try {
Class class9 = Class.forName("com.company.User");
System.out.println(class2 == class3);
Field[] fieldss = user.getClass().getDeclaredFields();
AccessibleObject.setAccessible(fieldss,true);
fieldss[1].set(user,100);
fieldss[0].set(user,"李四");
user.say("hello" ,user);
System.out.println();
Method methodss = user.getClass().getDeclaredMethod("getName");
System.out.println(methodss.invoke(user));
for (Field f :fieldss){
System.out.println(Modifier.toString(f.getModifiers())+","+f.getName()+","+f.getType());
}
}catch (Exception e){
e.printStackTrace();
}
// write your code here
}
}