Java 反射

一、实例化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.Student
com.learn.reflect.Student
com.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     //Student类声明的公有字段
public static int age           //Student类实现接口声明的公有字段
public java.lang.String tel     //Student类继承父类声明的公有字段
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));
	}
}
结果:
sky
nj
***********赋值************
cain
sh
三、获取类方法

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
结果:
sonShow   
fatherShow   //父类公共方法
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
********************************
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开发)