Java Reflection (java中的反射机制),reflectionjava
Java Reflection (java中的反射机制),reflectionjava
很久前转了一片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
相关文章
- 暂无相关文章
用户点评