Java反射机制

Java的反射机制是在运行状态中,对于任意一个类,都可以知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能叫做Java的反射机制。射其实就是加载类,并获取类的各个组成部分。

加载类:

java中有一个Class类用于代表某一个类的字节码。获取class对象的方式有三种:① 调用Class类的forName(),② 通过  类名.class; ③ 对象.getClass();

反射类的组成部分的方法有:

① 获取public类型的各个组成部分:

getConstructor(Class...parameterTypes);

getMethod(String name,Class...parameterTypes);

getField(String name);

② 获取private类型的各个组成部分:

getDeclaredConstructor(Class...parameterTypes);

getDeclaredMethod(String name,Class...parameterTypes);

getDeclaredField(String name);

从类中获取各个组成部分是为了使用该类的各个部分。

使用反射机制,调用Person类中的构造函数,示例代码:

Person:

public class Person {
	public Person()
	{
		System.out.println("Person ");
	}
	public Person(String name)
	{
		System.out.println("Person的姓名为:"+name);
	}
	public Person(String name,int age)
	{
		System.out.println("Person的姓名为:"+name+",年龄为"+age);
	}
	private Person(int age)
	{
		System.out.println("private age"+age);
	}
}
Demo:

public class Demo {

	// 反射无参数的构造函数
	@Test
	public void test1() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Constructor c = clazz.getConstructor(null);
		Person p = (Person) c.newInstance(null);
	}

	// 反射带一个参数的构造函数
	@Test
	public void test2() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Constructor c = clazz.getConstructor(String.class);
		Person p = (Person) c.newInstance("zhangsan");
	}

	// 反射两个参数的构造函数
	@Test
	public void test3() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Constructor c = clazz.getConstructor(String.class, int.class);
		Person p = (Person) c.newInstance("lisi", 20);
	}

	// 反射private的构造函数
	@Test
	public void test4() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Constructor c = clazz.getDeclaredConstructor(int.class);
		// private修饰的只能在类内部调用,但是反射可以通过下面方式调用private修饰的。
		c.setAccessible(true);// 暴力反射
		Person p = (Person) c.newInstance(15);
	}

	// 反射无参数构造函数的另一种方式,等效于test1
	@Test
	public void test5() throws Exception {
		Class clazz = Class.forName("cn.itcast.reflect.Person");
		Person p = (Person) clazz.newInstance();// 该方法只能调用无参数的构造方法;
	}

}
以上代码都是通过junit.Test来测试。运行结果如下:

Person 
Person的姓名为:zhangsan
Person的姓名为:lisi,年龄为20
private age15

Person 

利用反射机制中的Method执行方法是public Object invoke(Object object,Object... args),其中第一个参数为对象(当反射的是static类型的方法是,对象可以是null),第二个参数为方法所需要的参数。注意:在jdk 1.4时,没有可变参数,通过数组给参数列表传入参数,所以在反射main方法时,在传入参数列表时,① 把传入的数组类型强制转化成Object类型 ② 把传入的数组类型嵌套到Object数组中;




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值