java反射机制(reflection)

演示所需要的简单类


class AA{
public AA(String name){
System.out.println(name);
}
public AA(int id,String name){
System.out.println(id+" "+name);
}
public int id;
public String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}



实现类

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 MyReflection {
/*
* author nullpoint
* 个人最近正在学习struts,hibernate框架,框架很多地方用到了反射,为更好的理解
* 自己研究了一下JAVA的反射机制,个人的一些代码仅供大家参考
*/

public static void main(String[] args) {

//定义需要反射的class文件的路径
String classPath = "com.cao.reflection.AA";
try {
//通过下面的方法对class文件里的东西进行封装,可以在此基础上操作获得里面的类结构
Class<?> class1 = Class.forName(classPath);
//获取所有的构造器
Constructor[] constructors = class1.getConstructors();
System.out.println("指定类的构造器的个数是:"+constructors.length);
/*
* 打印构造器的定义形式(参见下面定义的AA类里的两个构造器)
* 结果是:public com.cao.reflection.AA(java.lang.String args0)
public com.cao.reflection.AA(int args0,java.lang.String args1)
*/
for(Constructor<?> constructor:constructors){
//获得对应构造函数的参数类型
Class<?>[] ptype = constructor.getParameterTypes();
//获得构造函数的修饰符(modifier),getModfiers()返回的是int类型,需要通过Modifier类转换为相应的修饰符
System.out.print(Modifier.toString(constructor.getModifiers())+" ");
//获得构造函数的名字
System.out.print(constructor.getName()+"(");
for (int i = 0; i < ptype.length; i++) {
//依次打印该构造函数所传递的参数
System.out.print(ptype[i].getName()+" args"+i);
//控制','的输出
if(i<ptype.length-1){
System.out.print(",");
}
}
System.out.print(")");
System.out.println();
}

//还可以根据打印输出的构造函数结构,调用相应的含参的构造函数
Object obj = constructors[1].newInstance(1,"bird");


Field[] fields =class1.getDeclaredFields();
for(Field field:fields){
System.out.println(Modifier.toString(field.getModifiers())+" "+field.getType().getName()+" "+field.getName());
}

//同样也可以通过class1.getDeclaredMethods()方法获取所有的方法,返回一个Method[]

//获取指定的方法
Field field = class1.getDeclaredField("name");
//第一个参数为方法名,第二个是一个可变参数,为变量类型
Method method =class1.getDeclaredMethod("setName", field.getType());

//调用获得的方法,第一个参数为该class文件的一个实例,第二个参数为该方法需要的参数(可变参数)
//这句话就相当于obj实例调用了他的一个method对应的方法
//因为我们不知道通过Class.forName(classPath).newInstance()方法实例中到底有什么方法
//只有通过这种方法对其里面的方法进行操作,struts框架填充form就是利用反射的这一点实现的
method.invoke(obj, "cat");
//调用完里面的对应方法后,我们就可以转型回来看看里面的东西了
AA aa = (AA) obj;
System.out.println(aa.getName());


} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException 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();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值