Java基础之《反射》

本文介绍了Java反射机制的基本概念及其应用示例。通过反射,程序可以在运行时动态地获取类的信息并创建实例,调用方法等。文章展示了如何使用反射来访问类的属性和方法,并演示了一个简单的动态代理实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反射是Java中一个非常重要的特性,它有着极大的灵活性。
反射机制就是指程序在运行期间,去确定对象的类型,可以通过Class文件去创建类的实例,调用其方法。

例子程序:

model类

package com.test.model;

public class Teacher {
	public String name;
	public String age;
	public String level;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	public String getLevel() {
		return level;
	}

	public void setLevel(String level) {
		this.level = level;
	}
	
	public void startClass () {
		System.out.println("开课了!");
	}
	
	public void echo (String str) {
		System.out.println("" + name + "说: " + str);
	}
}

Test类

package com.test.reflect;

import java.lang.reflect.*;
import java.lang.Class;


public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			//加载类文件
			Class<?> c1 = Class.forName("com.test.model.Teacher");
			//创建此Class类的一个实例
			Object o1 = c1.newInstance();
			//获得属性的列表
			Field[] fields = c1.getFields();
			//获得方法的列表
			Method[] methods = c1.getMethods();
			//获得指定方法
			//参数: 方法名 参数列表
			Method M1 = c1.getDeclaredMethod("setName", String.class);
			M1.invoke(o1, " 我是反射出来的 ");
			
			Method M2 = c1.getDeclaredMethod("startClass", null);
			M2.invoke(o1, null);
			
			Method M3 = c1.getDeclaredMethod("echo", String.class);
			M3.invoke(o1, "世界你好!");
			//遍历类的属性
			System.out.println("遍历类的属性:");
			for (Field f : fields) {
				System.out.println(f.toString());
			}
			//遍历类的方法
			System.out.println("遍历类的方法:");
			for (Method M : methods) {
				System.out.println(M.toString());
			}
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		
	}

}

执行结果:

开课了!
 我是反射出来的 说: 世界你好!
遍历类的属性:
public java.lang.String com.test.model.Teacher.name
public java.lang.String com.test.model.Teacher.age
public java.lang.String com.test.model.Teacher.level
遍历类的方法:
public void com.test.model.Teacher.startClass()
public void com.test.model.Teacher.echo(java.lang.String)
public java.lang.String com.test.model.Teacher.getAge()
public void com.test.model.Teacher.setAge(java.lang.String)
public java.lang.String com.test.model.Teacher.getName()
public void com.test.model.Teacher.setName(java.lang.String)
public java.lang.String com.test.model.Teacher.getLevel()
public void com.test.model.Teacher.setLevel(java.lang.String)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
设计模式中的动态代理就是依赖于反射机制这个基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值