Java Reflection (java中的反射机制)

很久前转了一片java反射机制 一直没学习。

今天研究了下java反射机制。

 

1 java 反射机制的作用和好处

(1)查看类结构,操作类

java反射机制的作用是 能够让java在运行状态中,能够得到一个类的属性,方法 ,构造函数....也能够调用这些属性和方法。

可就是说java可以再运行时,加载一个类。

比如在一个 本地的程序中 ,需要用到一个远程服务器上的类 (例如名字为"serverClass ")。

需要在运行程序是远程访问服务器,并且加载这个类。

可以使用一下代码:

Class c = Class.forName("serverClass");

此时就能在程序运行时得到serverClass的结构:

使用

c.getMethods()得到这个类的所有方法,

c.getFields()得到所有属性,

getContructor得到构造函数。

甚至可以使用这样的代码:

Object o = Class.forName("serverClass").newInstance();

得到一个ServerClass的一个实例。

要注意的是Class.forName("serverClass").newInstance();//调用没有参数的构造函数

这句代码 创建了2个对象。

一个对象是Class类型 用来描述ServerClass的结构(属性啊,方法啊,构造函数啊)

一个对象是Object类型 是ServerClass的实例。

这就是java 发射机制的一个作用。

 

(2)解耦

这种机制允许在运行时加载一个类。

这样我们的代码就 非常灵活了。

比如说在需要加载类时,使用XML保存这些类名,

使用String[]从XML中读取,

再使用Class.forName( String )加载这些类。

 

我们发现 在你的代码中跟没没有出现类的名字。但是可以执行这些类。

很显然 这达到了解耦的目的.

 

2. java 反射机制的用法

java 反射机制主要与这几个类有关

Method,Field,Constructor,Class

分别描述了方法 属性 构造函数 类。

 

看下面代码:

//reflection类

public class reflection {
	
	reflection(){}
	
	reflection(String _p1,String _p2){par1 = _p1 ; par2 = _p2;}
	public String par1;
	public String par2;
	//public Class2 par3;
	
	public String combinep1p2(){
		return par1+par2;
	}
	
	private void getValue(){
		//return par3.getValue();
	}
	
	public int caculate(int a, int b){return a+b;}
}

//main函数 查看reflection类的结构

Class c = Class.forName("reflection");
		
		for(int i = 0; i< c.getMethods().length ; i ++ ) 
			System.out.println(c.getMethods()[i].getName());
		
		for(int i = 0; i< c.getFields().length ; i ++) 
			System.out.println(c.getFields()[i].getName());
	


输出结果为:

caculate
combinep1p2
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
par1
par2

 

可以看到 输出了所有方法的名字并且输出了 它的父类Object的所有方法。

注意只能得到public属性的方法 private属性的无法得到。

 

下面是调用其方法的例子:

//一下代码是执行一个Class中的函数
		Class[] parameters = new Class[2];
	
		
		//定义函数参数类型
		parameters[0] = int.class;
		parameters[1] = int.class;
		Method m = c.getMethod("caculate",parameters);
		
		Object arguments[]  = new Object[2];
		arguments[0] = (int)1;
		arguments[1] = (int)2;
		
		reflection r = new reflection();
		Object o = m.invoke(r,arguments);
		
		System.out.println(o.toString());

输出:

3

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值