java反射机制学习

反射机制是java语言的一个特色,能够实现在类中调用其他类里的方法和属性。这一个特点可以很方便的在自己开发的框架中使用,可以说功能是比较强大的一个特性。

先建立一个新的java工程,目录结构如下:

Reflect类

package com.org.testReflect;

public class Reflect {
	public String str="123456";
	public void print(){
		System.out.println("test ====================print");
	}
	public void printStr(String str){
		System.out.println("the param is================"+str);
	}
	public static void main(String[] args) {
		System.out.println("beging test main method----------------------");
	}
}

TestRef是Reflect的一个测试类。

一、获得一个类中的方法和属性的一个比较简单的方法

1.获得这个类的实例

Class ref = Class.forName("com.org.testReflect.Reflect");
Reflect obj = (Reflect)ref.newInstance();

2.获得Reflect中的属性和方法

通过newInstance这个方法的使用,我们相当于在new了一个Reflect这个类。即是相当于这个方法

Reflect refs=new Reflect();

所以我们想获得这个类里面的方法和属性只要使用ref.就可以了。有的同学可能会问,既然可以直接的new一个类,为什么还要费那么大的劲,去使用Reflect个类的包名通过java的反射去获得类的实例呢?很简单,这是因为我们在一些情况下需要动态的去new一个类而不是某一个特定的类,这时候java反射就派上用场了。比如,我们在写框架的时候,可能会根据xml里面的配置属性去实例一个类的时候,由于xml里面的属性是变化的,所以要实例的类也是变化的,因此直接的new是不行的。

(1)获得无参数的方法

obj.print();

(2)获得带参数的方法

obj.printStr("1234");

(3)获得main方法

obj.main(args);

(4)获得属性

Reflect obj = (Reflect)ref.newInstance();
System.out.println("================="+obj.str);

这个类的代码

package com.org.testReflect;

public class TestRef {
public static void main(String[] args) {
	try {
		Reflect refs=new Reflect();
		Class ref = Class.forName("com.org.testReflect.Reflect");//Reflect.class.getName()
		//得到没有参数的方法
		Reflect obj = (Reflect)ref.newInstance();
		obj.print();
		obj.printStr("1234");
		obj.main(args);
		System.out.println("================="+obj.str);
	} 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();
	}
}
}

执行结果如下

test ====================print
the param is================1234
beging test main method----------------------
=================123456

我们可以看到,完全的进入到了Reflect这个类里面。而且得到里面的方法和属性,

二、反射机制的另外一种方法

上面提供了一种获得其他类中的Method的方法,这里我们给出另外的一种方法

1.加载要调用的类

Class ref = Class.forName(Reflect.class.getName());

2.调用方法

调用方法的时候,可以分为两步

a.获得要调用的方法

Method method=ref.getMethod(name, parameterTypes)

第一个参数是要调用的方法的名称,第二个参数表示的方法中参数的类型

b.调用方法

method.invoke(obj, args)

第一个参数是class的一个实例,如果是null的话,表示该方法是一个静态的,第二个参数是要传入的参数值。obj可以用下面的方法得到

Object obj = ref.newInstance();

下面分别举几个常用的方法的调用

(1)main方法

Method method = ref.getMethod("main", String[].class);
method.invoke(null,(Object)new String[]{});

(2)无参方法

Method mf=ref.getMethod("print", null);
mf.invoke(obj, null);

(3)带参数的方法

Method m=ref.getMethod("printStr", String.class);
m.invoke(obj, new String("asdf"));

运行结果

the param is================asdf
test ====================print
beging test main method----------------------

三、带构造函数的类

上面说的两种方法都是没有构造函数的类,若是有构造函数的话,上面的两种方法就不再适用了。
我们开始建立一个新的java类Reflect2.java代码如下

package com.org.testReflect;

public class Reflect2 {
	public Reflect2(String str) {
		// TODO Auto-generated constructor stub
		System.out.println("constructor begining run param str is============="+str);
	}
	public void print(){
		System.out.println("test ====================print");
	}
	public void printStr(String str){
		System.out.println("the param is================"+str);
	}
	public static void main(String[] args) {
		System.out.println("beging test main method----------------------");
	}
}

建立一个新的测试反射用的java类TestRef2.java

对于带有构造函数的类,若是还是像之前两种方那样用

ref.newInstance();

会报错的,有兴趣的同学可以自己试验下,看看报的错误是什么。

这里,我们可以按照下面的步骤来实例化这个类

1.得到构造器

Constructor<?>[] ref = Class.forName("com.org.testReflect.Reflect2").getConstructors();

2.实例化类

Object obj = ref[0].newInstance(new String("qaz"));

3.得到这个obj的实例后,就可以按照第二种进行调用了。这里不再赘述,测试的结果如下

constructor begining run param str is=============qaz
test ====================print
the param is================printString=========1234
beging test main method----------------------

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值