java class 获取类_Java反射机制-Class类获取类信息

1.什么是Java反射?

Java的反射是指通过一个已知类名就可以获取到该类的内部信息,如类的成员变量,方法,构造函数,而且可以通过反射动态的调用该对象的方法,假设我们有这样一个类

package com.crazycoder2010.reflect;

public class Demo {

private String strField;

protected Integer intField;

public double doubleField;

float floatField;

public static final Object DEMO = new Object();

public Demo(){

}

private Demo(float floatField){

this.floatField = floatField;

}

public Demo(String strField){

this.strField = strField;

}

public Demo(Double doubleField)throws IllegalArgumentException{

this.doubleField = doubleField;

}

public void sayHello(String word){

System.out.println("Hello "+word);

}

}

2.通过反射机制都能作什么操作?

2.1获取类的成员变量

我们来写这样一个方法来获取一下

private static void showFields() throws SecurityException, NoSuchFieldException {

Class> demo = Demo.class;

//这里能获取到的只有那些public 类型的field,开来还是要多看API,多实践,以前以为是所有的字段都可以的:)

//这个fields获取的只有两个值doubleField和DEMO

Field[] fields = demo.getFields();

for (Field field : fields) {

System.out.println("成员变量-"+field.getName());//这里很简单就是字段的名称doubleField

System.out.println("修饰符-"+field.getModifiers());//这个打印出来的是数字,搞成枚举更直接些,可能是java1.5之前不支持枚举,看数字再去对比Modifer类太头大了

System.out.println("字段声明类的类型-"+field.getDeclaringClass());//这个类没有继承关系,所以是com.crazycoder2010.reflect.Demo

System.out.println("字段类型-"+field.getGenericType());//获取该字段的类型

System.out.println("**************************");

}

}

2.2获取类的构造函数

private static void showConstructors() {

Class> demo = Demo.class;

Constructor>[] constructors = demo.getConstructors();//这里能获取到的列表也是public的

for(Constructor> constructor : constructors){

System.out.println("名称-"+constructor.getName());

if(constructor.getExceptionTypes().length>0){//判断一下构造函数中是否有异常抛出

StringBuilder str = new StringBuilder("抛出异常-{");

for(Class> e:constructor.getExceptionTypes()){

str.append(e.getName());//异常类的名称

str.append(" ");

}

str.append("}");

System.out.println(str.toString());

}

System.out.println("修饰符-"+constructor.getModifiers());

if(constructor.getParameterTypes().length>0){//构造函数的参数打印出来

StringBuilder stringBuilder = new StringBuilder();

stringBuilder.append("构造函数参数列表-{");

for(Class> t : constructor.getParameterTypes()){

stringBuilder.append(t.getName()).append(" ");

}

stringBuilder.append("}");

System.out.println(stringBuilder);

}else{

System.out.println("默认构造函数");

}

System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");

}

}

2.3获取方法

private static void showMethods() {

Class> demo = Demo.class;

Method[] methods = demo.getMethods();

for(Method m : methods){

System.out.println("方法名-"+m.getName());

System.out.println("修饰符-"+m.getModifiers());

if(m.getParameterTypes().length>0){

StringBuilder stringBuilder = new StringBuilder("参数列表-{");

for(Class> p : m.getParameterTypes()){

stringBuilder.append(p.getName()).append(" ");

}

System.out.println(stringBuilder.append("}"));

}

System.out.println("方法返回类型-"+m.getReturnType());

System.out.println("抛出异常个数-"+m.getExceptionTypes());

System.out.println("###############################");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值