- package com.reflect;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- public class MyReflect {
- public static void main(String[] args) throws Exception {
- // ReflectPoint re = new ReflectPoint(3, 5);
- // 通过反射拿到和该类相关联的构造方法类,指定参数是明确该类的哪个构造方法
- Constructor constructor = ReflectPoint.class.getConstructor(int.class,
- int.class);
- // 获取和该构造方法相关联的类
- Class c = constructor.getDeclaringClass();
- System.out.println(c);
- ReflectPoint re2 = (ReflectPoint) constructor.newInstance(6, 8);
- Field fieldY = re2.getClass().getField("y");
- Field fieldX = re2.getClass().getDeclaredField("x");
- fieldX.setAccessible(true);
- int y = (Integer) fieldY.get(re2);
- int x = (Integer) fieldX.get(re2);
- System.out.print(y);
- System.out.print(x);
- /*
- * 以下是三种获取Classl类的方法
- */
- Field fields1 = re2.getClass().getDeclaredField("s1");
- // Field fields1=ReflectPoint.class.getDeclaredField("s1");
- // Field fields1 = Class.forName("com.reflect.ReflectPoint")
- // .getDeclaredField("s1");
- fields1.setAccessible(true);// 暴力反射,强制该类私有属性可见
- // 这个比较简便获取类的实例对象,但该类必须有一个无参的构造方法
- // ReflectPoint ref = ReflectPoint.class.newInstance();
- // 如果该类没有无参的构造方法,且具备有参数的构造方法,用下面这两行代码获取类实例,即通过拿到构造方法对象con,通过con的NewInstance方法
- /*
- * Constructor
- * con=ReflectPoint.class.getConstructor(int.class,int.class);
- * ReflectPoint ref=(ReflectPoint) con.newInstance(9,9);
- */
- // 和该类相关联的属性类通过get(该类对象),拿到属性值
- // String s = (String) fields1.get(ref);
- // System.out.println(s);
- changeValue(re2);
- System.out.print(re2);
- }
- private static void changeValue(Object obj) throws Exception {
- // 拿到和这个类相关的所有变量类
- Field[] fields = obj.getClass().getFields();
- // 遍历变量类
- for (Field f : fields) {
- // 如果变量类的字节码与String的字节码相同
- if (f.getType() == String.class) {
- // 则通过get(这个类对象)拿到变量值
- String s = (String) f.get(obj);
- String newValue = s.replace('b', 't');
- f.set(obj, newValue);
- }
- }
- }
- }
复制代码 希望大家多多交流,指出理解的误区
|
|