欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java基础框架之reflect

程序员文章站 2024-02-20 19:23:10
...

                              java基础框架之reflect

  • 什么是reflect?
  • reflect的用法
Reflection is commonly used by programs which require the ability to examine or modify the runtime behavior of applications running in the Java virtual machine. This is a relatively advanced feature and should be used only by developers who have a strong grasp of the fundamentals of the language. With that caveat in mind, reflection is a powerful technique and can enable applications to perform operations which would otherwise be impossible.

反射(reflect)是一种可以在运行时动态获取或者改变对象行为的机制,这是由java语言提供的一种能力。

简单的讲:

  • 反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,也就是说类,类的成员,我们在运行的时候还可以动态地去操作他们。

再简单一点的讲:

  • 我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。

关于reflect的用法

根据类的全类名获取一个类的实例、类成员,在运行时动态改变类成员,代码如下

package com.reflect;

public class Student {
	public String id;
	public String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
}
package com.reflect;

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

public class ClassTest {
	public static void main(String args[]) throws InstantiationException, IllegalAccessException{
		try {
			Class studentClass = Class.forName("com.reflect.Student");
			Field[] fields = studentClass.getFields();
			for(Field field :fields){
				System.out.println("field:"+field.getName());
			}
			Method[] methods = studentClass.getMethods();
			for(Method method : methods){
				System.out.println("method:"+method);
			}
			Student student = (Student) studentClass.newInstance();
			System.out.println(student.getName());
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

运行结果如下

field:id
field:name
method:public java.lang.String com.reflect.Student.getName()
method:public java.lang.String com.reflect.Student.getId()
method:public void com.reflect.Student.setName(java.lang.String)
method:public void com.reflect.Student.setId(java.lang.String)
method:public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
method:public final void java.lang.Object.wait() throws java.lang.InterruptedException
method:public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
method:public boolean java.lang.Object.equals(java.lang.Object)
method:public java.lang.String java.lang.Object.toString()
method:public native int java.lang.Object.hashCode()
method:public final native java.lang.Class java.lang.Object.getClass()
method:public final native void java.lang.Object.notify()
method:public final native void java.lang.Object.notifyAll()
null

因为任何一个类的父类都是Class类,所以也会把父类的方法也打印出来,注意只有public关键字修饰的类成员才能通过反射来获取。

关于动态改变类成员代码如下

package com.reflect;

public class School {
	public Student student;
	public String schoolName;
	public Student getStudent() {
		return student;
	}
	public void setStudent(Student student) {
		this.student = student;
	}
	public String getSchoolName() {
		return schoolName;
	}
	public void setSchoolName(String schoolName) {
		this.schoolName = schoolName;
	}
}
package com.reflect;

import java.lang.reflect.Field;

public class SchoolTest {
	public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
		School sc = new School();
		Field[] fields = sc.getClass().getFields();
		for(Field field : fields){
			if(field.getName().equals("schoolName")){
				field.setAccessible(true); 
				field.set(sc, "中文学院");
				System.out.println(field.get(sc));
			}
			System.out.println(field.getType()+"=="+field.getName());
		}
	}
}

运行结果如下:

class com.reflect.Student==student
中文学院
class java.lang.String==schoolName

反射还可以获取类的注解,这是java一些框架的基础,比如spring hibernate

所以获取一个对象不止可以通过new关键字来获取,还可以通过java 的反射机制来获取。

关于反射的一些用法可以去查看java.lang.reflect包