Java反射

获取Class类对象

static Class forName(String className);
通过Class类名调用,是一个static修饰的静态方法,传入的参数是一个完整的包名.类名
例如:
Demo1 ==》 com.qfedu.a.Demo1
该方法有异常抛出 ClassNotFoundException

Class 类名.class
通过指定的类名调用,获取类对应的属性

Class 类对象.getClass();
通过类对象,获取对应当前类对象的class, Class类对象

		Class<?> cls1 = Class.forName("com.qfedu.b_reflect.Person");
        Class<Person> cls2 = Person.class;
        Class<? extends Person> cls3 = new Person().getClass();
        
        System.out.println(cls1);
        System.out.println(cls2);
        System.out.println(cls3);

class com.gdpu.demo.Person
class com.gdpu.demo.Person
class com.gdpu.demo.Person

获取Constructor类对象

Constructor[] getConstructors();
获取当前类内所有非私有化构造方法Constructor数组

		 Class<?> cls = Class.forName("com.gdpu.demo.Person");
		 Constructor<?>[] constructors = cls.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }

public com.gdpu.demo.Person(int,java.lang.String)
public com.gdpu.demo.Person(int)
public com.gdpu.demo.Person()

Constructor[] getDeclaredConstructors();
获取当前类内的所有构造方法Constructor数组,包括私有化构造方法

		Constructor<?>[] declaredConstructors = cls.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }
        System.out.println();

private com.gdpu.demo.Person(java.lang.String)
public com.gdpu.demo.Person(int,java.lang.String)
public com.gdpu.demo.Person(int)
public com.gdpu.demo.Person()

Constructor getConstructor(Class… initParameterType);
根据指定的参数类型,获取指定的非私有化构造方法类对象, Constructor
Class… 首先这里要求的数据类型是Class类对象,而且当前参数的个数不确定
可以不传入参数,也可以传入多个Class类型的参数。

		Constructor<?> nullConstructor = cls.getConstructor(null);
        System.out.println(nullConstructor);

        Constructor<?> intConstructor = cls.getConstructor(int.class);
        System.out.println(intConstructor);

        Constructor<?> doubleArgsConstructor = cls.getConstructor(int.class, String.class);
        System.out.println(doubleArgsConstructor);

public com.gdpu.demo.Person()
public com.gdpu.demo.Person(int)
public com.gdpu.demo.Person(int,java.lang.String)

Constructor getDeclaredConstructor(Class… initParameterType);
根据指定的参数类型,获取指定的构造方法类对象,包括私有化构造方法。
Class… 这里是一个不定长参数,需要的参数类型是Class类对象,个数不限!!!

		Constructor<?> stringConstructor = cls.getDeclaredConstructor(String.class);
        System.out.println(stringConstructor);

private com.gdpu.demo.Person(java.lang.String)

Object newInstance(Object… initParameter);
通过Constructor类对象调用,传入参数是当前构造方法,创建对象所需的实际参数。

		Object obj1 = nullConstructor.newInstance(null);
        System.out.println(obj1);

        Object obj2 = intConstructor.newInstance(10);
        System.out.println(obj2);

        Object obj3 = doubleArgsConstructor.newInstance(10, "测试");
        System.out.println(obj3);

Person [id=0, name=null, test=10]
Person [id=10, name=null, test=10]
Person [id=10, name=测试, test=10]

获取Method类对象

Method[] getMethods();
获取当前类内所有的非私有化成员方法,包括从父类继承而来的可以在子类使用的成员方法

		Method[] methods = cls.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println();

public java.lang.String com.gdpu.demo.Person.toString()
public java.lang.String com.gdpu.demo.Person.getName()
public int com.gdpu.demo.Person.getId()
public void com.gdpu.demo.Person.setName(java.lang.String)
public static void com.gdpu.demo.Person.test()
public void com.gdpu.demo.Person.game()
public void com.gdpu.demo.Person.game(java.lang.String)
public void com.gdpu.demo.Person.setId(int)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()

Method[] getDeclaredMethods();
获取当前类内的所有方法,但是不包括从父类继承而来方法

		 Method[] declaredMethods = cls.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }

public java.lang.String com.gdpu.demo.Person.toString()
public java.lang.String com.gdpu.demo.Person.getName()
public int com.gdpu.demo.Person.getId()
public void com.gdpu.demo.Person.setName(java.lang.String)
public static void com.gdpu.demo.Person.test()
public void com.gdpu.demo.Person.game()
public void com.gdpu.demo.Person.game(java.lang.String)
private void com.gdpu.demo.Person.testPrivate()
private void com.gdpu.demo.Person.testPrivate(java.lang.String)
public void com.gdpu.demo.Person.setId(int)

Method getMethod(String methodName, Class… parameterTypes);
获取类内指定方法名和参数类型的非私有化成员方法
String methodName: 指定的方法名字
Class… parameterTypes 当前方法参数类型的Clas类对象,不定长参数

		Method game1 = cls.getMethod("game", null);
        Method game2 = cls.getMethod("game", String.class);

public void com.gdpu.demo.Person.game()
public void com.gdpu.demo.Person.game(java.lang.String)

Method getDeclaredMethod(String methodName, Class… parameterTypes);
获取类内指定方法名和参数类型的成员方法,包括私有化方法
String methodName: 指定的方法名字
Class… parameterTypes 当前方法参数类型的Clas类对象,不定长参数

		Method testPrivate1 = cls.getDeclaredMethod("testPrivate", null);
        Method testPrivate2 = cls.getDeclaredMethod("testPrivate", String.class);

private void com.gdpu.demo.Person.testPrivate()
private void com.gdpu.demo.Person.testPrivate(java.lang.String)

Object invoke(Object obj, Object… args);
Object obj 调用当前方法的类对象
Object… args 执行当前方法需要的实际参数列表

 game2.invoke(cls.getConstructor(null).newInstance(null), "World Of Tank");
 //利用cls.getConstructor(null).newInstance(null)创建一个类对象,并调用它的game2方法,参数为"World Of Tank

玩World Of Tank

获取Field类对象

Field[] getFields();
获取当前类内的所有非私有化成员变量类对象,返回的是一个Field类型数组

 		Field[] fields = cls.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println();

public int com.gdpu.demo.Person.test
public static int com.gdpu.demo.Person.testStatic

Field[] getDeclareFields();
获取当前类内的所有成员变量,包括私有化成员变量,返回的是一个Field类对象数组

		Field[] declaredFields = cls.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        System.out.println();

private int com.gdpu.demo.Person.id
private java.lang.String com.gdpu.demo.Person.name
public int com.gdpu.demo.Person.test
public static int com.gdpu.demo.Person.testStatic

Field getField(String fieldName);
通过指定成员变量的名字。获取指定的成员变量类对象,但是不能获取私有化成员变量

Field test = cls.getField("test");
        System.out.println(test);

public int com.gdpu.demo.Person.test

Field getDeclaredField(String fieldName);
通过指定的成员变量名字。获取指定的成员变量类对象,而且可以获取私有化成员变量

Field id = cls.getDeclaredField("id");
        System.out.println(id);

private int com.gdpu.demo.Person.id

void set(Object obj, Object value);
Object obj 是操作当前成员变量的类对象
value 是给予当前成员变量的值
Object get(Object obj);
Object obj 指定获取哪一个类对象中成员变量数据

Person p = (Person) cls.getConstructor(null).newInstance(null);
        id.setAccessible(true);
        id.set(p, 20);
        test.set(p, 100);

        System.out.println(p);

        System.out.println(id.get(p));
        System.out.println(test.get(p));

Person [id=20, name=null, test=100]
20
100

给予暴力反射操作权限

void setAccessible(boolean)
针对getDeclaredXXX()
暴力反射获取的内容,默认情况下类外没有操作权限,如果调用当前方法,传入参数为true,
就可以使用暴力反射内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值