java反射简单实现

1.什么是java反射

java反射是一种能够在项目运行时,知道任意一个类的属性方法并能够调用他们。

2.反射的优缺点

优点:反射机制可以实现动态创建对象和编译

缺点:性能影响,使用反射基本是一种解释操作,解释操作慢于直接执行

3.java中获取class对象的四种方法

Ⅰ、通过class类静态方法 forname
 

class c = class.forName("name");

Ⅱ、通过object类的getClass方法

String a = "123";
Class c = a.getClass();

Ⅲ、如果T是 一个已定义类型的话,在java中可以通过 .class获取

Student s = new Student();
class c = s.class;
class d = int.class;

Ⅳ、运用primitive wrapper classes的TYPE语法

Class c = Integer.TYPE;
Class d = Double.TYPE;

4.demo(如下)

student 类

import java.util.Date;
 
public class Student {
	private String studentID;
	public String studentName;
	private Date birthday;
	private int score;
 
	public String getStudentID() {
		return studentID;
	}
 
	public void setStudentID(String studentID) {
		this.studentID = studentID;
	}
 
	public String getStudentName() {
		return studentName;
	}
 
	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}
 
	public Date getBirthday() {
		return birthday;
	}
 
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
 
	public int getScore() {
		return score;
	}
 
	public void setScore(int score) {
		this.score = score;
	}
 
	public void finishTask(String taskName) {
		System.out.println(studentName + "完成了" + taskName + "作业");
	}
}

ReflectStudentTest1测试类

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
 
public class ReflectStudentTest1 {
	public static void main(String[] args) {
		try {
			// 获取Student的Class对象
			//Class<?> clazz = Class.forName("com.hdw.Student");
			//Class<?> clazz = Student.class;
			Class<?> clazz = new Student().getClass();
			// 获取该类中所有的属性
			Field[] fields = clazz.getDeclaredFields();
			// 遍历所有的属性
			for (Field field : fields) {
				// 打印属性信息,包括访问控制修饰符,类型及属性名
				System.out.println(field);
				System.out.println("修饰符:" + Modifier.toString(field.getModifiers()));
				System.out.println("类型:" + field.getType());
				System.out.println("属性名:" + field.getName());
			}
			// 获取该类中的所有方法
			Method[] methods = clazz.getDeclaredMethods();
			for (Method method : methods) {
				// 打印方法签名
				System.out.println(method);
				System.out.println("修饰符:"
						+ Modifier.toString(method.getModifiers()));
				System.out.println("方法名:" + method.getName());
				System.out.println("返回类型:" + method.getReturnType());
				// 获取方法的参数对象
				Class<?>[] clazzes = method.getParameterTypes();
				for (Class<?> class1 : clazzes) {
					System.out.println("参数类型:" + class1);
				}
			}
 
			// 通过Class对象创建实例
			Student student = (Student) clazz.newInstance();
			// 获取属性名为studentName的字段(Field)对象,以便下边重新设置它的值
			Field studentName = clazz.getField("studentName");
			// 设置studentName的值为”张三“
			studentName.set(student, "张三");
			// 通过Class对象获取名为”finishTask“,参数类型为String的方法(Method)对象
			Method finishTask = clazz.getMethod("finishTask", String.class);
			// 调用finishTask方法
			finishTask.invoke(student, "数学"); 
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
}

喜欢本文的朋友们,欢迎关注微信公众号“Java面试达人”,收看更多精彩内容

也可关注微博 “程序员阿九”,收看更多精彩内容 

猜你喜欢

转载自blog.csdn.net/longzhongxiaoniao/article/details/88054025
今日推荐