反射

来源:互联网 发布:幽灵行动4画面优化 编辑:程序博客网 时间:2024/06/06 18:20

反射

反射机制:反射就是通过获取该类的字节码文件对象。

获取方式:

1>Object类中的getClass()方法,表示正在运行的那个类:Class类。

2>数据类型的Class属性

3>Class类中的特有方法:forName(String className):(重点)

public static Class<?> forName(String className):获取字节码文件对象。字符串的内容是一个类的全路径名称。

获取所有公共构造方法:

public Constructor<?>[] getConstructors():返回的是一个构造方法所在数组。

获取所有构造方法:

public Constructor<?>[] getDeclaredConstructor():获取的是当前字节码文件对象中所有的构造方法.

获取单个构造方法:

public Constructor<T> getConstructor(Class<?>...parameterTypes):返回的是一个Constructor对象,反映Class对象所表示的类的指定公共构造方法。

public T newInstance(Object... initargs):传递的是实际参数,表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例.

相关代码:

public class Person {private String name;int age;public String address;public Person(){}private Person(String name){this.name=name;}Person(String name,int age){this.name=name;this.age=age;}public Person(String name,int age,String address){this.name=name;this.age=age;this.address=address;}public void show(){System.out.println("show");}public void method(String s){System.out.println("method"+s);}public String getString(String s,int i){return s+"---"+i;}private void function(){System.out.println("function");}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + ", address="+ address + "]";}}
//获取构造方法import java.lang.reflect.Constructor;public class ReflectDemo {public static void main(String[] args) throws Exception {Class c = Class.forName("westos_01.Person");Constructor[] con=c.getConstructors();for(Constructor constructor:con){System.out.println(constructor);}System.out.println("----------------");Constructor[] con1=c.getDeclaredConstructors();for(Constructor constructor1:con1){System.out.println(constructor1);}System.out.println("----------------");Constructor con2=c.getConstructor();Object newInstance = con2.newInstance();System.out.println(newInstance);System.out.println("----------------");Constructor con3=c.getConstructor(String.class,int.class,String.class);Object newInstance2 = con3.newInstance("立华奏",20,"音无");System.out.println(newInstance2);}}

获取成员变量:

获取所有公共成员变量:

public Field[] getField():返回的Field对象数组。

获取单个公共成员变量:

public Field getField(String name):获取公共的指定的字段。参数为当前成员变量名称

将指定对象变量上此 Field 对象表示的字段设置为指定的新值public void set(Object obj, Object value).

public Field getDeclaredField(String name):获取类或接口中已经声明的指定的字段.

public void setAccessible(boolean flag):在访问的时候取消java语言访问检查(强制性).值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查.

相关代码:

import java.lang.reflect.Constructor;import java.lang.reflect.Field;public class Reflect2Demo {public static void main(String[] args) throws Exception {Class c=Class.forName("westos_01.Person");Field[] fields = c.getFields();for(Field f:fields){System.out.println(f);}System.out.println("-------------------");Constructor con=c.getConstructor();Object object = con.newInstance();Field field = c.getField("address");field.set(object, "立华奏");System.out.println(object);System.out.println("-------------------");Field declaredField = c.getDeclaredField("name");declaredField.setAccessible(true);declaredField.set(object, "音无");System.out.println(object);System.out.println("-------------------");Field declaredField2 = c.getDeclaredField("age");declaredField2.setAccessible(true);declaredField2.set(object, 20);System.out.println(object);}}

获取成员方法:

获取所有公共成员方法:

public Method[] getMethods():获取当前该字节码文件对象(Person.class)中自己本身以及它父类中所有的公共成员方法.

public Method[] getDeclaredMethods():获取当前字节码文件对象本身所有的成员方法

获取单个公共成员方法:

public Method getMethod(String name,Class<?>... parameterTypes):指定公共成员方法。参数1:表示方法名;参数2:该方法的参数类型的Class对象:String.class

public Object invoke(Object obj, Object... args)参数1:表示当前针对哪个以实例对象进行方法的调用,参数2:当前调用该方法的时候里面传递的实际参数。

public Method getDeclaredMethod(String name,Class<?>... parameterTyape'nrs):获取的是已经指定的声明方法。

相关代码:

import java.lang.reflect.Constructor;import java.lang.reflect.Method;public class Reflect3Demo {public static void main(String[] args) throws Exception {Class c=Class.forName("westos_01.Person");Method[] m=c.getMethods();for(Method mt:m){System.out.println(mt);}Constructor con=c.getConstructor();Object object = con.newInstance();Method m1=c.getMethod("show");m1.invoke(object);System.out.println("-----------------------");Method m2=c.getMethod("method", String.class);m2.invoke(object, "method");System.out.println("-----------------------");Method m3=c.getMethod("getString", String.class,int.class);String getString=(String) m3.invoke(object, "立华奏",20);System.out.println(getString);System.out.println("-----------------------");Method m4=c.getDeclaredMethod("function");m4.setAccessible(true);m4.invoke(object);}}