時間軸:
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、根據類名:類名.classClass 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反序列化驗證工具
本文章由李豆豆喵和番薯小羊卷~共同完成!