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());}}














0 0
原创粉丝点击