JAVA反射机制及应用例子
JAVA 反射机制是Java 被视为动态(或准动态)语言的一个关键性质。这个机制允许程式在运行时通过Reflection APIs 取得任何一个已知名称的class 的内部资讯,包括其modifiers(诸如public, private,static 等等)、superclass(例如Object)、interfaces(例如Cloneable),也包括fields 和methods 的所有资讯, 并在运行时调用任意一个对象的方法;生成动态代理。下面以一段代码来看一下主要的Reflection APIs,代码中有相应的注释。
Java代码
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class Goods
{
private String id;
private double price;
public Goods(){
System.out.println("it is a pen");
}
public Goods(String s1,String s2){
System.out.println(s1+"*"+s2);
}
public String getId()
{
System.out.println(id);
return id;
}
public void setId(String id)
{
this.id = id;
}
public String addName(String str1,String str2){
return str1+str2;
}
/**
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws NoSuchMethodException
* @throws SecurityException
* @throws InvocationTargetException
* @throws IllegalArgumentException
* @throws NoSuchFieldException
* @功能描述
* @输入参数
* @反馈值
*/
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException
{
// TODO Auto-generated method stub
String str = "com.xtlh.sinye.Goods";
Class c = Class.forName(str);
Object obj = c.newInstance();//初始化一个Goods的对象
/**
* //这里设置属性的值 调用setId()方法,类型用Class[],参数用Object[]
*/
Method m = c.getMethod("setId",new Class[]{Class.forName("java.lang.String")});
m.invoke(obj,new Object[]{"it's apple"});
System.out.println("---------------------------------------------------------------------");
/**
* //这里是里获取属性的值 调用getId()方法
*/
m = c.getMethod("getId",new Class[]{});
m.invoke(obj,new Object []{});
System.out.println("---------------------------------------------------------------------");
/**
* //获得类中声明的方法
*/
Method me[] = c.getDeclaredMethods();
for(int i=0;i<me.length;i++){
System.out.println("method["+i+"]="+me[i].toString());
}
System.out.println("---------------------------------------------------------------------");
/**
* //模拟 instanceof 操作符
*/
boolean b1 = c.isInstance(new Integer(34));
System.out.println("Goods is a instance of Integer ? "+b1);
boolean b2 = c.isInstance(new Goods());//这里调用了无参的构造方法
System.out.println("Goods is a instance of Goods ? "+b2);
System.out.println("---------------------------------------------------------------------");
/**
* //找出类的方法,类的名称,类的方法的参数,类的方法的返回类型
*/
Method med[] = c.getDeclaredMethods();
Method med1[] = c.getMethods();//从字面意思可以看出来,这里找到所有的方法,即可以找到继承来的方法等
for(int i=0;i<med.length;i++){
Method mee = med[i];
System.out.println("method # "+i+" name="+mee.getName());
System.out.println("declaring class ="+mee.getDeclaringClass());
//方法的参数类型
Class pvec[] = m.getParameterTypes();
for(int
补充:软件开发 , Java ,