Java反射学习记录

java的反射机制很重要,任何一个框架都要运用到反射,很多的操作也都是依靠反射来完成的,下面是我们在空余时间自己写的一点对于Java反射API的一些用法的小列子,虽然很简单,但是希望贴出来一起探讨:
Scanner scanner = new Scanner(System.in);
String name = scanner.next();
System.out.println("当前的类是:"+name);
try {
Class<?> obj = Class.forName(name);
Object stu = obj.newInstance();

/**
* Field操作
* */

//获得该类下的所有属性(不包括父类)
Field[] declareFields = obj.getDeclaredFields();

System.out.println("该类下(不包括父类)的所有参数....");
for (Field field : declareFields) {
//访问private和protect时需要设置该属性为true,不然会报异常
field.setAccessible(true);
System.out.println("属性名:"+field.getName()+" 修饰符:"+Modifier.toString(field.getModifiers()) + " 数据类型:" + field.getType());
Class<?> fieldType = field.getType();
//判定fielType的类型是不是String
if (String.class.isAssignableFrom(fieldType)) {
field.set(stu, "zhangsan");
System.out.println("方法名:" + field.getName() + "值:" + field.get(stu));
}
//判定fielType类型是不是Integer
if (Integer.class.isAssignableFrom(fieldType)) {
field.set(stu, 1);
System.out.println("方法名:" + field.getName() + "值:" + field.get(stu));
}

System.out.println("GenericString : " + field.toGenericString());
System.out.println("Class :" + field.getDeclaringClass());
}
System.out.println("----------------------------------------------");

//获得该类及其父类下所有public属性
Field[] fields = obj.getFields();
System.out.println("该类的所有public属性(包括其父类中的属性)");
for (Field field : fields) {
System.out.println("描述符为public的属性名:"+field.getName()+" 修饰符:"+Modifier.toString(field.getModifiers()) + " 数据类型:" + field.getType());
}
System.out.println("----------------------------------------------");

/**
* Method操作
*/

//获得该类下(不包括父类)的所有方法(包括private,protect,包控制权限,public)
Method[] declareMethods = obj.getDeclaredMethods();
System.out.println("该类(不包括父类)的所有方法.....");
for (Method method : declareMethods) {
System.out.println("方法名:" + method.getName()+ "方法修饰符: "+ Modifier.toString(method.getModifiers()));
System.out.println("方法返回值为:" + method.getReturnType() );
//获得该方法的所有参数的Class,如:参数String,获得的就是String.class对象
Class<?>[] paras = method.getParameterTypes();
System.out.println("该方法的参数如下:");
for (Class<?> para : paras) {
System.out.println(para);
}
}
System.out.println("----------------------------------------------");

//获得该类下及其父类的所有public方法
Method[] methods = obj.getMethods();
System.out.println("该类(包括父类)的所有方法.....");
for (Method method : methods) {
System.out.println("方法名:" + method.getName()+ "方法修饰符: "+ Modifier.toString(method.getModifiers()));
System.out.println("方法返回值类型为:" + method.getReturnType() );
//获得该方法的所有参数的Class,如:参数String,获得的就是String.class对象
Class<?>[] paras = method.getParameterTypes();
System.out.println("该方法的参数如下:");
for (Class<?> para : paras) {
System.out.println(para);
}
}
System.out.println("----------------------------------------------");

/**
* 构造函数操作
*/

//获得该类下所有的构造函数
Constructor<?>[] constructors = obj.getDeclaredConstructors();
System.out.println("该类的所有构造函数.....");
for (Constructor<?> constructor : constructors) {
System.out.println("构造函数:" +constructor.getName());
System.out.println("该构造函数的修饰符:"+Modifier.toString(constructor.getModifiers()));
Class<?>[] conTypes = constructor.getParameterTypes();

if (conTypes.length > 0) {
for (Class<?> conType : conTypes) {
System.out.println("构造函数的参数:" + conType);
}
}
}
System.out.println("----------------------------------------------");

//获得该类下所有的构造函数
Constructor<?>[] cons= obj.getConstructors();
System.out.println("该类的所有构造函数.....");
for (Constructor<?> constructor : cons) {
System.out.println("构造函数:" +constructor.getName());
System.out.println("该构造函数的修饰符:"+Modifier.toString(constructor.getModifiers()));
Class<?>[] conTypes = constructor.getParameterTypes();

if (conTypes.length > 0) {
for (Class<?> conType : conTypes) {
System.out.println("构造函数的参数:" + conType);
}
}
}
System.out.println("----------------------------------------------");
/**
* 获得该内的superClass
*/
Class<?> superClass = obj.getSuperclass();
System.out.println("该类的父类是:"+superClass.toString());
System.out.println("----------------------------------------------");

/**
* 获得该类实现的接口
*/
Class<?>[] interfaces = obj.getInterfaces();
if (interfaces.length > 0) {
System.out.println("该类西线的接口如下:");

for (Class<?> inter : interfaces) {
System.out.println("该接口为:" + inter.toString());
}
} else {
System.out.println("该类没有实现接口");
}
System.out.println("----------------------------------------------");


/**
* 获得该类的包
*/
Package p = obj.getPackage();
if ( null != p) {
System.out.println("该类的包: " + p.toString());
} else {
System.out.println("该类没有在包下进行管理");
}

} catch(Exception e) {
e.printStackTrace();
}
这些只是一些自己写的测试列子,其中对于发射的很多API还没有设计,如果要仔细研究,可以在网上搜一些相关的文章。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值