跳至主要內容

Java 反射简单应用

JI,XIAOYONG...大约 1 分钟

简介

反射,用来在运行时获取给定类的构造函数,变量,方法,并对其作以修改,而不必在编译时获取该类。

Reflection allows programmatic access to information about the fields, methods and constructors of loaded classes, and the use of reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions.

--https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/package-summary.htmlopen in new window

简单使用

定义一个待反射的类 ATestClass.java

package cf.android666.reflect;

public class ATestClass {

	public String name;
	private int age;
	
	public ATestClass() {
		// TODO Auto-generated constructor stub
	}

	private void init(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getAge() {
		// TODO Auto-generated method stub
		return " age: " + age;
	}
	
}

在 TestReflect.java 中反射

//核心代码
public static void main(String[] args){
	//注意这里需要是完整的类名,包括包名
	Class<?> clazz = Class.forName("cf.android666.reflect.ATestClass");
	ATestClass aTestClsObj=(ATestClass) clazz.newInstance();
  
	//反射获取变量
	Field mName = clazz.getDeclaredField("name");
	mName.setAccessible(true);
			
	mName.set(aTestClsObj, "aReflect");
	System.out.println(aTestClsObj.name);
			
	//反射获取方法
	Method mInit= clazz.getDeclaredMethod("init", String.class,int.class);
	mInit.setAccessible(true);//解除私有限定,让我们在用反射时访问私有变量
	mInit.invoke(aTestClsObj, "aInitName",66);
	System.out.println(aTestClsObj.name + aTestClsObj.getAge());

}

小结

反射的用法较为简单

  • 通过Class.froName() 获取 Class 对象clazz ,获取要反射的 Class 对象aTestClsObj
  • 通过clazz 获取要反射 Class 的变量、方法
  • 通过aTestClsObj 操作这些变量,方法

其中需要注意的有

  • f.setAccessible(true); 方法可以解除private 限制,进而可以操作类的私有变量,方法
  • clazz.getXXX() 方法获取全部公有变量、方法,包括父类或接口的 xx,clazz.getDeclaredXXX() 方法获取全部 变量、方法,包括私有的,实现接口的方法,但是不包括父类的
文章标题:《Java 反射简单应用》
本文作者: JI,XIAOYONG
发布时间: 2018/01/16 21:28:57 UTC+8
更新时间: 2023/12/30 16:17:02 UTC+8
written by human, not by AI
本文地址: https://jixiaoyong.github.io/blog/posts/3e9e8cb1.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。转载请注明出处!
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.8