反射

 1 package com.lxj.demo;
 2 
 3 public class Boy {
 4     // 私有构造方法
 5     private Boy(){
 6         System.out.println("已经被实例化");
 7     }
 8     // 单例模式,在本类中私有化实现Boy对象(static)指唯一的
 9     private static Boy boy = new Boy();
10     // 提供外界访问的方法,返回值是Boy
11     public static Boy getInstance(){
12         return boy;
13         
14     }
15     // 私有成员方法meet
16     private void meet(){
17         System.out.println("踢足球");
18     }
19     // 私有属性
20     private String name = "qinyu";
21 }
 1 package com.lxj.demo;
 2 
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5 import java.lang.reflect.Method;
 6 
 7 public class Demo {
 8     public static void main(String[] args) {
 9         try {
10             // 加载类。这里的?是一个占位符的意思。boyClass是保存加载类的所有信息
11             Class<?> boyClass = Class.forName("com.lxj.demo.Boy");
12             // constructor表示保存构造方法的信息
13             Constructor<?> constructor = boyClass.getDeclaredConstructor();
14             // 设置constructor的访问性
15             constructor.setAccessible(true);
16             // 实例化boy对象
17             Boy boy = (Boy) constructor.newInstance();
18             // tMethod表示保存成员方法的信息,拿到私有的成员方法meet
19             Method tMethod = boyClass.getDeclaredMethod("meet");
20             // 设置tMethod的访问性
21             tMethod.setAccessible(true);
22             // 通过tMethod来调用boy对象的meet方法
23             tMethod.invoke(boy);
24             // field表示保存成员变量(属性),拿到了私有的属性name
25             Field field = boyClass.getDeclaredField("name");
26             // 设置field的访问性
27             field.setAccessible(true);
28             // 调用boy对象里面的成员属性强转成string类型
29             String name = (String) field.get(boy);
30             // 打印出成员属性的值
31             System.out.println(name);
32         } catch (Exception e) {
33             // TODO Auto-generated catch block
34             e.printStackTrace();
35         }
36     }
37 }
原文地址:https://www.cnblogs.com/lxjhoney/p/6406407.html