Java 反射
来源:互联网 发布:windows update35%卡住 编辑:程序博客网 时间:2024/06/10 21:55
创建 POJO
//Persion.javapublic class Person { public void show() { }}//Student.javapublic class Student extends Person{ // 成员变量 public String name = "张三";// 公共 private int age;// 私有 // public 构造方法 public Student() { System.out.println("无参构造方法"); } // public 构造方法 public Student(String name) { System.out.println("姓名:" + name); } // private 构造方法 private Student(int age) { System.out.println("年龄:" + age); } // 默认 构造方法 Student(String name, int age) { System.out.println("姓名:" + name + ",年龄:" + age); } // public 普通方法 public void m1() { System.out.println("m1"); } // public 普通方法 public void m2(String name) { System.out.println(name); } // public 普通方法 public String m3(String name) { return name; } // public 普通方法 public static void m5(String name, int age) { System.out.println(name + "," + age); } // public 普通方法 public static void m6(String[] args) { for (int i = 0; i < args.length; i++) { System.out.println(args[i]); } } // private 普通方法 private void m4(int age) { System.out.println(age); }}
获取构造方法
- Class相关的常用方法:
1. static Class forName(String className)
返回与带有给定字符串名的类或接口相关联的 Class 对象。 - 与构造函数相关的方法:
1. Constructor getConstructor(Class … parameterTypes)
返回一个 Constructor 对象,返回 指定(参数) 的公共构造方法。
2. Constructor [] getConstructors()
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的 所有 公共构造方法。
3. Constructor getDeclaredConstructor(Class… parameterTypes) // Declared 声明
返回一个 Constructor 对象,返回 指定(参数) 的公共构造方法(包括私有构造方法)
4. Constructor[] getDeclaredConstructors()
返回 Constructor 对象的一个数组,返回 所有 构造方法(包括私有构造方法) - 初始化对象的相关方法:
1. T newInstance(Object… initargs)
使用此 Constructor 对象表示的 构造方法 来创建该构造方法的声明类的新实例,并用指定的 初始化参数 初始化该实例。
2. T newInstance()
创建此 Class 对象所表示的类的一个新实例。
public class 获取构造方法 { @Test public void test1() throws Exception { Student stu = (Student) getClazz("cn.itcast.reflect.Student"); } /** * 根据给定的 String 获取 Class,并创建该实例 */ private Object getClazz(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException { Class clazz = Class.forName(className); return clazz.newInstance(); } @Test // 得到 **字节码** 对象的3种方式 public void test2() throws Exception { // 1. Class clazz = Class.forName("cn.itcast.reflect.Student"); // 2. Class clazz = Student.class; // 3. Student stu = new Student(); Class clazz = stu.getClass(); clazz.newInstance(); } @Test // 无参构造,初始化对象 // public Student() public void test3() throws Exception { Class clazz = Class.forName("cn.itcast.reflect.Student"); // clazz.newInstance(); Constructor c = clazz.getConstructor();// 得到一无参构造函数 c.newInstance(); } @Test // 有参构造,初始化对象 // public Student(String name) public void test4() throws Exception { Class clazz = Class.forName("cn.itcast.reflect.Student"); // clazz.newInstance(); Constructor c = clazz.getConstructor(String.class);// 得到一个有参(String类型)构造函数 c.newInstance("tom"); } @Test // 私有的构造方法,初始化对象 // public Student(int age) public void test5() throws Exception { Class clazz = Class.forName("cn.itcast.reflect.Student"); // clazz.newInstance(); Constructor c = clazz.getDeclaredConstructor(int.class);// 得到一个有参(int类型)私有构造函数 c.setAccessible(true);// 暴力反射,Accessible 无障碍 c.newInstance(20); } @Test // 默认的构造方法,初始化对象 // public Student(String name,int age) public void test6() throws Exception { Class clazz = Class.forName("cn.itcast.reflect.Student"); // clazz.newInstance(); Constructor c = clazz.getDeclaredConstructor(String.class, int.class);// 得到一个有参(String类型)构造函数 c.setAccessible(true);// 暴力反射,Accessible 无障碍 c.newInstance("tom", 20); } @Test // 获取全部的 公共构造方法 public void test7() throws Exception { Class clazz = Class.forName("cn.itcast.reflect.Student"); Constructor[] cs = clazz.getConstructors(); System.out.println(cs.length); } @Test // 获取全部的 构造方法 public void test8() throws Exception { Class clazz = Class.forName("cn.itcast.reflect.Student"); Constructor[] cs = clazz.getDeclaredConstructors(); System.out.println(cs.length); }}
获取变量
- Field 相关的方法
1. Field getField(String name)
返回一个 Field 对象,它反映此 Class 对象 所表示的 类或接口 的指定公共成员字段。
2. Field[] getFields()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
3. Field getDeclaredField(String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
4. Field[] getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。 - 操作Field对象的方法:
1. Object get(Object obj) 返回指定对象上此 Field 表示的字段的值。
2. void set(Object obj, Object value) 给第一个参数所表示的对象,第二个参数 赋值
Modifier 类
Modifier 类提供了 static 方法和常量,对类和成员访问修饰符进行解码。
修饰符集被表示为整数,用不同的位 位置 (bit position) 表示不同的修饰符。
表示修饰符的常量值取自于 The JavaTM Virtual Machine Specification, Second edition 的表 4.1、4.4、4.5 和 4.7。
public class 获取变量 { @Test // 操作 公共变量name public void test1() throws Exception { Student stu = new Student(); Class clazz = Student.class; Field f = clazz.getField("name"); System.out.println(f.get(stu)); // 赋值 f.set(stu, "李四"); Field f1 = clazz.getField("name"); System.out.println(f1.get(stu)); } @Test // 操作 私有变量age public void test2() throws Exception { Student stu = new Student(); Class clazz = Student.class; Field f = clazz.getDeclaredField("age"); f.setAccessible(true); f.set(stu, 18); /* 不同的Field 对象,每次都需要 setAccessible(true); Field f1 = clazz.getDeclaredField("age"); f1.setAccessible(true); */ System.out.println(f.get(stu)); } @Test // 操作 所有变量 public void test3() throws Exception { Student stu = new Student(); Class clazz = Student.class; // Field f = clazz.getDeclaredField("name"); Field[] fs = clazz.getDeclaredFields(); for (Field f : fs) { System.out.println( Modifier.toString(f.getModifiers()) + "\t" + f.getType().getSimpleName() + "\t" + f.getName()); } /* 无参构造方法 public String name private int age final ExampleUnitTest this$0 */ }}
获取方法
- 与操作方法相关的方法:
1. Method getMethod(String name, Class
public class 获取方法 { @Test // public void m1() public void test1() throws Exception { // Student stu = new Student(); Class clazz = Student.class; Method m = clazz.getMethod("m1"); m.invoke(clazz.newInstance(), null); // 此方法代表要执行m方法。第一个参数:表示要执行哪个对象中的方法,第二个参数:代表实参。 } @Test // public void m2(String name) public void test2() throws Exception { Class clazz = Student.class; Method m = clazz.getMethod("m2", String.class); m.invoke(clazz.newInstance(), "tom"); // 此方法代表要执行m方法。第一个参数:表示要执行哪个对象中的方法,第二个参数:代表实参。 } @Test // public String m3(String name){ public void test3() throws Exception { Class clazz = Student.class; Method m = clazz.getMethod("m3", String.class); Object o = m.invoke(clazz.newInstance(), "tom"); // invoke方法的返回值,就是执行的方法的返回值。如果是void的方法,则返回null。 System.out.println(o); } @Test // private void m4(int age) public void test4() throws Exception { Class clazz = Student.class; Method m = clazz.getDeclaredMethod("m4", int.class); m.setAccessible(true); m.invoke(clazz.newInstance(), 18); // invoke方法的返回值,就是执行的方法的返回值。如果是void的方法,则返回null。 } @Test // public static void m5(String name,int age) public void test5() throws Exception { Class clazz = Student.class; Method m = clazz.getMethod("m5", String.class, int.class); m.invoke(null, "tom", 18); // invoke方法的返回值,就是执行的方法的返回值。如果是void的方法,则返回null。 } @Test // public static void m6(String[] args){ public void test6() throws Exception { Class clazz = Student.class; Method m = clazz.getMethod("m6", String[].class); // m.invoke(null,new Object[]{new String[]{"tom","jerry","aaa"}}); // //invoke方法的返回值,就是执行的方法的返回值。如果是void的方法,则返回null。 m.invoke(clazz.newInstance(), (Object) new String[] { "tom", "jerry", "aaa" }); } @Test // 得到所有方法 public void test7() throws Exception { Class clazz = Student.class; Method[] ms = clazz.getMethods();// 得到所有公共的方法 System.out.println(ms.length); } @Test // 得到所有方法 public void test8() throws Exception { Class clazz = Student.class; Method[] ms = clazz.getDeclaredMethods();// 得到当前类所有方法 System.out.println(ms.length); }}
使用反射打印制定类内容
public class 反射打印制定类内容 { public static void main(String[] args) { Class c = Student.class; System.out.println(c); //从命令行 参数 或 用户输入 中读取的类名 String name; Scanner input = new Scanner(System.in); System.out.println("输入类名(例如java.util.Date):"); name = input.next(); try { //打印 类名 和 父类名(if != Object) Class c1 = Class.forName(name); Class superc1 = c1.getSuperclass(); String modifiers = Modifier.toString(c1.getModifiers());//将修饰符打印出来 if(modifiers.length()>0) System.out.print(modifiers); System.out.print(" class "+name); if(superc1 != null && superc1 != Object.class) System.out.print(" extends "+ superc1.getName()); System.out.print("\n{\n"); printConstructors(c1); System.out.println(); printMethods(c1); System.out.println(); printFields(c1); System.out.println("}"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 打印一个类的所有构造函数 * @param c1 a class */ public static void printConstructors(Class c1){ Constructor[] constructors = c1.getDeclaredConstructors(); for (Constructor c : constructors) { String name = c.getName(); System.out.print(" "); String modifiers = Modifier.toString(c.getModifiers()); if(modifiers.length()>0) System.out.print(modifiers + " "); System.out.print(name + "("); //打印参数类型 Class[] paramTypes = c.getParameterTypes(); for (int i = 0; i < paramTypes.length; i++) { if(i > 0)System.out.print(", "); System.out.print(paramTypes[i].getName()); } System.out.println(");"); } } /** * 打印类的所有方法 * @param c1 a class */ public static void printMethods(Class c1){ Method[] methods = c1.getDeclaredMethods(); for (Method m : methods) { Class retType = m.getReturnType(); String name = m.getName(); System.out.print(" "); //打印修饰符,返回类型和方法名 String modifiers = Modifier.toString(m.getModifiers()); if(modifiers.length()>0) System.out.print(modifiers + " "); System.out.print(retType.getName() + " " + name + "("); //打印参数类型 Class[] paramTypes = m.getParameterTypes(); for (int i = 0; i < paramTypes.length; i++) { if(i > 0)System.out.print(", "); System.out.print(paramTypes[i].getName()); } System.out.println(");"); } } /** * 打印类的所有字段 * @param c1 a class */ public static void printFields(Class c1){ Field[] fields = c1.getDeclaredFields(); for (Field f : fields) { System.out.print(" "); Class type = f.getType(); String name = f.getName(); String modifier = Modifier.toString(f.getModifiers()); if(modifier.length()>0)System.out.print(modifier + " "); System.out.println(type + " " + name +";"); } }}/*打印内容class com.wjz.ExampleUnitTest$Studentpublic class com.wjz.ExampleUnitTest$Student extends com.wjz.ExampleUnitTest$Person{ com.wjz.ExampleUnitTest$Student(com.wjz.ExampleUnitTest, java.lang.String, int); private com.wjz.ExampleUnitTest$Student(com.wjz.ExampleUnitTest, int); public com.wjz.ExampleUnitTest$Student(com.wjz.ExampleUnitTest, java.lang.String); public com.wjz.ExampleUnitTest$Student(com.wjz.ExampleUnitTest); public void m1(); private void m4(int); public java.lang.String m3(java.lang.String); public void m2(java.lang.String); public void m6([Ljava.lang.String;); public void m5(java.lang.String, int); public class java.lang.String name; private int age; final class com.wjz.ExampleUnitTest this$0;}*/
阅读全文
0 0
- 【反射】JAVA反射机制
- JAVA 反射
- java 反射
- Java反射
- java反射
- java反射
- JAVA反射
- java 反射
- Java 反射
- java 反射
- Java反射
- java反射
- JAVA 反射
- java 反射
- Java反射
- java反射
- java 反射
- java 反射
- git 常用指令总结——基于廖雪峰大神的Git教程
- Android Studio 3.0及中文输入法不显示的问题解决
- 用C语言实现优先级排序和MATLABsort函数的比较
- java 网络编程 基础socket
- fork: retry:资源暂时不可用
- Java 反射
- Http服务器--使用Http服务做转发
- 如何理解Python装饰器?
- git中统计代码行数
- shell 脚本中双引号、单引号、反引号的区别
- openshift/origin工作记录(4)——Pod时区同步
- 在 Web 应用中增加用户跟踪功能
- git在用https进行push时候免输账密的方法
- 流量平台 淘宝必备 流量加购收藏100%安全保障