时间轴:
Java反射相关类图解:
反射:
1、什么是 Java 反射
2、为什么要用到反射
3、反射机制应用
演示案例:
Java-反射-Class 对象类获取
Java-反射-Field 成员变量类获取
Java-反射-Method 成员方法类获取
Java-反射-Constructor 构造方法类获取
Java-反射-不安全命令执行&反序列化链
#Java-反射-Class 对象类获取
演示:
1.创建ReflectDemo
2.删除这三个和子目录
3.创建user:
4.创建成员变量,构造方法,成员方法:
package com.example.reflectdemo;
public class User {
//成员变量
public String name="xiaodi";
public int age = 31;
private String gender="man";
protected String job="sec";
//构造方法
public User(){
//System.out.println("无参数");
}
public User(String name){
System.out.println("我的名字"+name);
}
private User(String name,int age){
System.out.println(name);
System.out.println(age);
}
//成员方法
public void userinfo(String name,int age,String gender,String job){
this.job=job;
this.age=age;
this.name = name;
this.gender=gender;
}
protected void users(String name,String gender){
this.name = name;
this.gender=gender;
System.out.println("users成员方法:"+name);
System.out.println("users成员方法:"+gender);
}
}
获取类的4种方法:
//1、根据类名:类名.class
Class userClass = User.class;
//2、根据对象:对象.getClass()
User user = new User();
Class aClass = user.getClass();
//3、根据全限定类名:Class.forName("全路径类名")
Class aClass1 = Class.forName("com.example.reflectdemo.User");
//4、通过类加载器获得 Class 对象:
//ClassLoader.getSystemClassLoader().loadClass("全路径类名");
ClassLoader clsload=ClassLoader.getSystemClassLoader();
Class aClass2 =
clsload.loadClass("com.example.reflectdemo.User");
注意:获取全部路径是复制路径——复制引用
package com.example.reflectdemo;
public class GetClass {
public static void main(String[] args) throws ClassNotFoundException {
//1、根据全限定类名:Class.forName("全路径类名")
Class aClass = Class.forName("com.example.reflectdemo.User");
System.out.println(aClass);
//2、根据类名:类名.class
Class userClass = User.class;
System.out.println(userClass);
//3、根据对象:对象.getClass()
User user= new User();
Class aClass1 = user.getClass();
System.out.println(aClass1);
//4、通过类加载器获得Class对象://ClassLoader.getSystemClassLoader().loadClass("全路径类名");
ClassLoader clsload=ClassLoader.getSystemClassLoader();
Class aClass2 = clsload.loadClass("com.example.reflectdemo1.User");
System.out.println(aClass2);
}
}
运行结果:
Java-反射-Field 成员变量类获取
利用反射获取变量图解
创建GetFiled:
package com.example.reflectdemo;
import java.lang.reflect.Field;
public class GetFiled {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
Class aClass = Class.forName("com.example.reflectdemo.User");
//获取公共的成员变量
// Field[] fields = aClass.getFields();
// for(Field fd:fields){ //将Fields的值依次给到fd
// System.out.println(fd);
// }
//获取所有的成员变量
// Field[] fields = aClass.getDeclaredFields();
// for(Field fd:fields){
// System.out.println(fd);
// }
// //获取单个的公共成员变量
// Field name = aClass.getField("name");
// System.out.println(name);
//
// //获取单个的成员变量
// Field gender = aClass.getDeclaredField("gender");
// System.out.println(gender);
//获取公共的成员变量age的值
User u = new User();
Field field=aClass.getField("age");
//取值
Object a=field.get(u);
System.out.println(a);
//赋值
field.set(u,32);
Object aa=field.get(u);
System.out.println(aa);
}
}
第一个获取公共的成员变量的运行结果:Filed[] getFields():
得到的与User.java中的public下的变量相似
第二个获取所有的成员变量的运行结果:
第三个 1.获取单个的公共成员变量 2.获取单个的成员变量
第四个赋值与获取值:
Java-反射-Constructor 构造方法类获取
获取构造方法图解:
创建GetConstructor:
package com.example.reflectdemo;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class GetConstructor {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Class aClass = Class.forName("com.example.reflectdemo.User");
//获取公共的构造方法
// Constructor[] constructors = aClass.getConstructors();
// for (Constructor con:constructors){
// System.out.println(con);
// }
//获取所有的构造方法
// Constructor[] constructors = aClass.getDeclaredConstructors();
// for (Constructor con:constructors){
// System.out.println(con);
// }
//获取单个的公共的构造方法
// Constructor constructor = aClass.getConstructor(String.class);
// System.out.println(constructor);
//
// //获取单个的构造方法
// Constructor con1 = aClass.getDeclaredConstructor(String.class,int.class);
// System.out.println(con1);
//对构造方法进行操作(两个参数string,int)
// Constructor con2=aClass.getDeclaredConstructor(String.class,int.class);
// //临时开启对私有的访问
// con2.setAccessible(true);
// User uu=(User) con2.newInstance("xiaodigaygay",40);
//System.out.println(uu);
//对构造方法进行执行(1个参数strin)
// Constructor con2=aClass.getConstructor(String.class);
// con2.newInstance("xiaodigaygay");
}
}
第一个获取公共的构造方法
第二个获取所有的构造方法
第三个获取单个的构造方法(公共+私有)
第四个对构造方法进行操作
Java-反射-Method 成员方法类获取
利用反射获取成员方法图解:
创建GetMethod:
package com.example.reflectdemo1;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class GetMethod {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class aClass = Class.forName("com.example.reflectdemo1.User");
// //获取包括继承的公共成员方法
// Method[] methods = aClass.getMethods();
// for(Method me:methods){
// System.out.println(me);
// }
//获取不包括继承的所有成员方法
// Method[] methods = aClass.getDeclaredMethods();
// for(Method me:methods){
// System.out.println(me);
// }
//获取单个的成员方法
// Method users = aClass.getDeclaredMethod("users", String.class,String.class);
// System.out.println(users);
//对成员方法进行执行
// User u = new User();
// Method users = aClass.getDeclaredMethod("users", String.class,String.class);
// users.invoke(u,"xiaodigay","gay1");
}
}
获取包括继承的公共成员方法
以下为继承的方法
获取不包括继承的所有成员方法
获取单个的成员方法
对成员方法进行执行
Java-反射-不安全命令执行&反序列化链‘
对于反序列化基础就是反射(jdbc(连接数据库),rmi)
package com.example.reflectdemo;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class GetRunExec {
public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//原生调用 JDK自带的rt.jar
//Runtime.getRuntime().exec("calc");
//如果是第三方的jar包呢
Class aClass = Class.forName("java.lang.Runtime");
//获取所有公共包括继承的成员方法
// Method[] methods = aClass.getMethods();
// for(Method me:methods){
// System.out.println(me);
// }
//获取exec成员方法
Method exec = aClass.getMethod("exec", String.class);
//获取getRuntime成员方法
Method getRuntimeMethod = aClass.getMethod("getRuntime");
//执行
Object runtime = getRuntimeMethod.invoke(aClass);
exec.invoke(runtime, "calc.exe");
}
}
1.使用原生调用 JDK自带的rt.jar
按住runtime可以查看getRuntime()这个函数的出处
2.使用反射机制来启动计算器
可以使用ctl+F来进行搜索
JAVA反序列化
JAVA反序列化 - Commons-Collections组件 - 先知社区
JAVA反序列化 - 反射机制 - 先知社区
java反序列化验证工具
本文章由李豆豆喵和番薯小羊卷~共同完成!