晟天帝成神之路
中二病洛晟危
 1 package it.cn.source.reflect;
 2 
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5 import java.lang.reflect.Method;
 6 
 7 /**
 8  * 该类是用于验证反射概念以及用法:
 9  *             1.获取字节码文件对象--通过全限定名
10  *             2.通过字节码文件对象获取构造方法
11  *             3.通过字节码文件对象获取普通方法
12  *             4.同过字节码文件对象获取字段
13  *                 私有化字段,先调用方法破坏其封装
14  *                 然后赋值,取值
15  * @author Administrator
16  *
17  */
18 public class RefeletTest {
19 
20     public static void main(String[] args) throws Exception {
21         //1.获取字节码文件
22         Class<?> clazz = Class.forName("it.cn.source.reflect.A");//完全限定路径名
23         //2.通过当前字节码对象,获取构造方法
24 //        Constructor<?>[] constructors = clazz.getConstructors();//只能获取所以public修饰的构造方法
25 //        for (Constructor<?> constructor : constructors) {//用增强for循环遍历
26 //            System.out.println("public修饰的 --:"+constructor);
27 //        }
28 //        Constructor<?>[] constructors2 = clazz.getDeclaredConstructors();//获取所以修饰权限的构造方法
29 //        for (Constructor<?> constructor1 : constructors2) {
30 //            System.out.println("所以修饰权限的构造方法 : " +constructor1);
31 //        }
32         //3.通过当前字节码文件对象,获取制定某一个构造方法(也就是根据参数)
33         Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(int.class,String.class);
34         System.out.println(declaredConstructor);
35         //执行该方法,创建一个对象,用Constructor中的方法 newInstance()
36         Object instance = declaredConstructor.newInstance(3,"");
37         //4.通过当前字节码文件对象,获取普通方法
38         Method method = clazz.getDeclaredMethod("test",int.class);//根据方法名和方法的形参获取当前方法对象
39         method.invoke(instance, 3);//因为该方法是实例方法,所以只能用对象调用,需要在第一个参数位置,将上面的instance传入
40         
41         Method method1 = clazz.getDeclaredMethod("test",int.class,int.class);//根据方法名和方法的形参获取当前方法对象
42         method1.invoke(null, 3,5);//该方法是static方法,所以需要在第一个参数位置写null,因为不需要对象调用
43         
44         //5.通过当前字节码文件对象,获取字段
45          Field field = clazz.getDeclaredField("a");//该字段是private修饰的,所以不能直接赋值取值
46         //首先要破坏其封装性
47         field.setAccessible(true);//true:表示破坏封装,false表示不破坏,默认是false
48         //破坏之后给字段赋值,该字段是没用static修饰的,所以需要一个对象
49         field.set(instance, 3);//3是实际参数
50         //然后取值,该字段没有static修饰,所以需要一个对象
51         Object object = field.get(instance);
52         System.out.println(object);
53         //获取全限定名
54         String name = clazz.getName();
55         System.out.println("全限定名为: " + name);
56         //获取类名简称
57         String simpleName = clazz.getSimpleName();
58         System.out.println("类名简称 :" +simpleName);
59     }
60 
61 }
62 class A{
63     private int a = 1;
64     public String str;
65     boolean b = false;
66     
67     private A(){
68         System.out.println("私有无参构造!");
69     }
70     A(int a){
71         System.out.println("默认有一个参数!");
72     }
73     public A(String str){
74         System.out.println("私有有一个参数!");
75     }
76     public A(int a,String str){
77         System.out.println("public两个参数");
78     }
79     private void test(){
80         
81     }
82     void test(int a){
83         
84     }
85     public static int test(int a,int b){
86         return a+b;
87     }
88     public String test(String str){
89         return null;
90     }
91 }

 

posted on 2022-11-28 17:41  洛晟  阅读(20)  评论(0)    收藏  举报