Java 反射
来源:互联网 发布:flash ftp软件绿色版 编辑:程序博客网 时间:2024/06/06 01:27
一、实例化Class类对象
1、Class.forName()方法
2、类.class
3、对象.getClass()
package com.learn.reflect;public class ReflectDemo {public static void main(String[] args) throws ClassNotFoundException {Class demo1 = Class.forName("com.learn.reflect.Student");Class demo2 = Student.class;Student stu = new Student();Class demo3 = stu.getClass();System.out.println(demo1.getName());System.out.println(demo2.getName());System.out.println(demo3.getName());}}结果:
com.learn.reflect.Studentcom.learn.reflect.Studentcom.learn.reflect.Student
二、获取类字段
1、获取Field对象
getField(String name) 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
getFields() 返回一个 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
getDeclaredField(String name) 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
Field[] getDeclaredFields() 返回 Field
对象的一个数组,这些对象反映此 Class
对象所表示的类或接口所声明的所有字段。
package com.learn.reflect;import java.lang.reflect.Field;import java.lang.reflect.Modifier;public class ReflectDemo3 {public static void main(String[] args) throws ClassNotFoundException {Class<?> demo = Class.forName("com.learn.reflect.Student");// 获取声明的所有字段Field[] fields = demo.getDeclaredFields();for (int i = 0; i < fields.length; i++) {// 权限修饰符int mo = fields[i].getModifiers();String pub = Modifier.toString(mo);// 属性类型Class<?> type = fields[i].getType();System.out.println(pub + " " + type.getName() + " " + fields[i].getName());}System.out.println("**************************");// 获取可访问的公共字段Field[] fields1 = demo.getFields();for (int i = 0; i < fields1.length; i++) {// 权限修饰符int mo = fields1[i].getModifiers();String pub = Modifier.toString(mo);// 属性类型Class<?> type = fields1[i].getType();System.out.println(pub + " " + type.getName() + " " + fields1[i].getName());}}}结果:
private java.lang.String name //Student类声明的私有字段public java.lang.String add //Student类声明的公有字段**************************public java.lang.String add <span style="font-family: Arial, Helvetica, sans-serif;">//Student类声明的公有字段</span>public static int age <span style="font-family: Arial, Helvetica, sans-serif;">//Student类实现接口声明的公有字段</span>public java.lang.String tel <span style="font-family: Arial, Helvetica, sans-serif;">//Student类继承父类声明的公有字段</span>2、对象字段的值操作
get(Object obj) 返回指定对象上此 Field 表示的字段的值。
set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值
package com.learn.reflect;import java.lang.reflect.Field;public class ReflectDemo3 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException,IllegalArgumentException, IllegalAccessException {Class<?> demo = Class.forName("com.learn.reflect.Student");Student stu = new Student();stu.setAdd("nj");stu.setName("sky");// 获取字段相应值Field fieldPri = demo.getDeclaredField("name");Field fieldPub = demo.getField("add");//获取赋值私有字段需添加fieldPri.setAccessible(true);System.out.println(fieldPri.get(stu));System.out.println(fieldPub.get(stu));System.out.println("***********赋值后************");fieldPri.set(stu, "cain");fieldPub.set(stu, "sh");System.out.println(fieldPri.get(stu));System.out.println(fieldPub.get(stu));}}结果:
skynj***********赋值************cainsh三、获取类方法
1、获取Method对象
getMethod(String name, Class<?>... parameterTypes) 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
getMethods() 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
getDeclaredMethod(String name, Class<?>... parameterTypes) 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
package com.learn.reflect;import java.lang.reflect.Field;import java.lang.reflect.Method;public class ReflectDemo3 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException,IllegalArgumentException, IllegalAccessException {Class<?> demo = Class.forName("com.learn.reflect.Student");//公共方法Method[] method1 = demo.getMethods();for(int i=0;i<method1.length;i++){System.out.println(method1[i].getName());}System.out.println("********************************");//不包括继承的方法Method[] method2 = demo.getDeclaredMethods();for(int i=0;i<method2.length;i++){System.out.println(method2[i].getName());}}}结果:
sonShow fatherShow //父类公共方法waitwaitwaitequalstoStringhashCodegetClassnotifynotifyAll********************************show //私有方法sonShow //公有方法2、执行获取方法
invoke(Object obj, Object... args) 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法
package com.learn.reflect;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class ReflectDemo3 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException,IllegalArgumentException, InvocationTargetException {Class<?> demo = Class.forName("com.learn.reflect.Student");Student stu = new Student();// 调用私有方法Method m1 = demo.getDeclaredMethod("show");m1.setAccessible(true);m1.invoke(stu);// 调用公共方法Method m2 = demo.getMethod("sonShow");m2.invoke(stu);}}
四、实例化其他类对象
package com.learn.reflect;public class ReflectDemo {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {// 通过Class实例化其他类的对象Class demo1 = Class.forName("com.learn.reflect.Student");Student stu = (Student) demo1.newInstance();stu.setName("sky");System.out.println(stu.getName());}}五、调用其他类的构造函数
1、getConstructors 返回构造函数数组
2、getConstructor(Class<?>... parameterTypes) 根据参数返回指定构造函数
package com.learn.reflect;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;public class ReflectDemo {public static void main(String[] args)throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {//调用其他类的构造函数Class demo1 = Class.forName("com.learn.reflect.Student");Constructor<?>[] cons = demo1.getConstructors();Student stu1 = (Student) cons[0].newInstance();Student stu2 = (Student) cons[1].newInstance("cain");System.out.println(stu1.getName());System.out.println(stu2.getName());Constructor<?> cons1 = demo1.getConstructor(String.class);Student stu3 = (Student) cons1.newInstance("sky");System.out.println(stu3.getName());}}六、返回实现接口、父类
1、getInterfaces()返回实现接口的Class数组
2、getSuperclass()返回父类的Class对象
package com.learn.reflect;public class ReflectDemo3 {public static void main(String[] args) throws ClassNotFoundException {Class<?> demo = Class.forName("com.learn.reflect.Student");// 返回类的实现接口Class<?>[] intes = demo.getInterfaces();for (int i = 0; i < intes.length; i++) {System.out.println("实现接口:" + intes[i].getName());}// 返回类的父类Class<?> superClass = demo.getSuperclass();System.out.println("继承的父类为:" + superClass.getName());}}
- 【反射】JAVA反射机制
- JAVA 反射
- java 反射
- Java反射
- java反射
- java反射
- JAVA反射
- java 反射
- Java 反射
- java 反射
- Java反射
- java反射
- JAVA 反射
- java 反射
- Java反射
- java反射
- java 反射
- java 反射
- Cable master poj 1064
- 用栈实现汉诺塔
- HDU 5753 Permutation Bo
- C语言sscanf() 用法举例
- Graphics View
- Java 反射
- 应对高并发笔记
- HDU 3367 Pseudoforest
- mysql二进制转成字符串
- linphone-LinponeCore.java文件分析
- 交叉编译环境下的CmakeList(demo)
- HDOJ 1551 Cable master
- HDU 5754 Life Winner Bo
- CSS+DIV定位分析(relative,absolute,static,fixed)