继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java学习:反射

我的袜子都是洞
关注TA
已关注
手记 17
粉丝 27
获赞 51

反射

使用反射可以直接获取class字节码文件中的类型、属性、方法。

演示代码:

新建一个名为User的类作为反射的操作对象

public class User {
	private int id;
	private String name;
	private String password;
	public User() {
	
	}
	/**
	 * @return the id
	 */
	public int getId() {
		return id;
	}
	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}
	/**
	 * @return the password
	 */
	public String getPassword() {
		return password;
	}
	/**
	 * @param id the id to set
	 */
	public void setId(int id) {
		this.id = id;
	}
	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}
	/**
	 * @param password the password to set
	 */
	public void setPassword(String password) {
		this.password = password;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", password=" + password + "]";
	}
	
	
}

演示

获取类

Object u = new User();
Class class1 = u.getClass();

获取类名

class1.getName()

获取类访问权限

int modifier = class1.getModifiers();
boolean flag = Modifier.isPublic(modifier);
System.out.println("是public?: "+flag);

属性

获取类所有属性
访问权限私有的也可以获取到

Field[] arr = class1.getDeclaredFields();
for (Field field:arr) {
	System.out.println ("类中的属性:" + field);
}

获取类所有属性的值
私有属性默认无法获取,但是可以通过不检查访问权限来直接获取。

// 获取所有属性的值
for (Field field:arr) {
	// 不检查访问权限
	field.setAccessible(true);
	// 获取u对象中field的值
	Object o = field.get(u);
	System.out.println("类中的属性值:" +o);
}

指定属性名获取属性

Field f = class1.getDeclaredField("name");
f.setAccessible(true);
f.set(u, "张三");
Object o = f.get(u);
System.out.println("name: " + o);

方法

获取所有方法(包含从父类继承的方法)

Method[] allMethods = class1.getMethods();
System.out.println("类的所有方法:");
for (Method method:allMethods) {
	System.out.println(method);
}

获取类自己的方法

Method[] onlyMethods = class1.getDeclaredMethods();
for (Method method:onlyMethods) {
	System.out.println(method);
}

调用无参带返回值方法

Method method2 = class1.getDeclaredMethod("getName");
String str = (String)(method2.invoke(u));
System.out.println ("返回值:"+ str);

调用有参无返回值方法

Method method = class1.getDeclaredMethod("setName", String.class);
method.invoke(u, "李四");

完整演示代码:

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ReflectTest {
	public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, InvocationTargetException {
		Object u = new User();
		// 获取到User的类
		Class class1 = u.getClass();
		
		System.out.println("类名:"+class1.getName());
		
		// 获取类访问权限
		int modifier = class1.getModifiers();
		boolean flag = Modifier.isPublic(modifier);
		System.out.println("是public?: "+flag);
		
		// 获取所有属性
		Field[] arr = class1.getDeclaredFields();
		for (Field field:arr) {
			System.out.println ("类中的属性:" + field);
		}
		// 获取所有属性的值
		for (Field field:arr) {
			// 不检查访问权限
			field.setAccessible(true);
			// 获取u对象中field的值
			Object o = field.get(u);
			System.out.println("类中的属性值:" +o);
		}
		
		// 指定字段名称获取属性
		Field f = class1.getDeclaredField("name");
		f.setAccessible(true);
		f.set(u, "张三");
		Object o = f.get(u);
		System.out.println("name: " + o);
		
		// 获取所有方法 (包含继承方法)
		Method[] allMethods = class1.getMethods();
		System.out.println("类的所有方法:");
		for (Method method:allMethods) {
			System.out.println(method);
		}
		// 获取当前类的自己的方法
		Method[] onlyMethods = class1.getDeclaredMethods();
		for (Method method:onlyMethods) {
			System.out.println(method);
		}
		
		// 调用有参方法
		Method method = class1.getDeclaredMethod("setName", String.class);
		method.invoke(u, "李四");
		
		// 调用无参有返回值方法
		Method method2 = class1.getDeclaredMethod("getName");
		String str = (String)(method2.invoke(u));
		System.out.println ("返回值:"+ str);
		
	}

}

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP