Java反射机制

Java中提供了Class类,可以通过Class类获取类的定义信息,包括包名、类名、类上的注释(Annotation)、类的修饰符、父类、继承的接口、构造方法、成员变量和成员方法。这些信息分别使用java.lang.annotation.Annotation、 java.lang.reflect.Constructor、java.lang.reflect.Field、java.lang.reflect.Method、java.lang.reflect.Modifier来表示。可以动态调用方法和属性。下面的例子展示了基本用法。

package ch5;

import static java.lang.System.out;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ClassInfo {
 
 public static void main(String args[]){
  
  Class c=String.class;
  // 1、得到所有方法
  Method[] methods = c.getMethods();
  // 2、得到某个方法
  try{
   // 第一个参数是方法的名字,后面的参数是参数的类型
      Method find = c.getMethod("indexOf", int.class);
      // 动态调用,第一个参数是对象,后面的参数是方法的实参(采用了变长参数)
      System.out.println(find.invoke("hello,welcome!",'c'));
  }catch(Exception e){
   e.printStackTrace();
  }
  // 3、得到类的名字
  out.println("类的名字为:"+c.getName());
  // 4、得到包名,通过Package对象处理
  System.out.println("包名为:"+c.getPackage().getName());
  // 5、得到修饰符,通过Modifier处理
  int modifier = c.getModifiers();
  if(Modifier.isPublic(modifier)){
   System.out.println("类是公有的!");
  }
  if(Modifier.isPrivate(modifier)){
   System.out.println("类是私有的!");
  }
  if(Modifier.isFinal(modifier)){
   System.out.println("类是最终类!");
  }
  // 6、得到父类
  System.out.println("父类的名字为:"+c.getSuperclass().getName());
  // 7、得到实现的接口
  System.out.println("实现的接口:");
  for(Class cc:c.getInterfaces()){
   System.out.print(cc.getName()+",");
  }
  
  // 8、得到类上的注释
  System.out.println("类上的注释:");
  for(Annotation a:c.getAnnotations()){
   System.out.print(a.toString());
  }
  
  // 9、得到构造方法
  System.out.println("构造方法有:");
  for(Constructor constructor:c.getConstructors()){
   System.out.print(constructor.toString());
  }
  
  // 10、创建实例
  try{
   Object o = c.newInstance();
  }catch(Exception e){
   e.printStackTrace();
  }
  
  // 11、解析方法
  for(Method method:methods){
   System.out.print("方法名字:"+method.getName());
   System.out.print("方法参数列表:");
   for(int i=0;i<method.getParameterTypes().length;i++)
    System.out.print(method.getParameterTypes()[i].getName()+",");
   System.out.print("方法的异常列表:"+method.getExceptionTypes());
   System.out.print("方法的返回值类型:"+method.getReturnType());
   if(Modifier.isPublic(method.getModifiers())){
    System.out.print("方法是公有的");
   }
   if(Modifier.isStatic(method.getModifiers())){
    System.out.print("方法是静态的");
   }
   System.out.println("方法的修饰符:"+method.getModifiers());
   /*
    * 返回的修饰符是一个数字,是对多个修饰符的编码,可以通过Modifier来判断是否是包含某个修饰符
    * 例如:Modifier.isPublic(method.getModifiers())判断是否包含public修饰符
    */
  }
  
  // 12、解析属性
  Field[] filds = c.getFields();
  for(Field fild:filds){
   // 得到属性名字
   System.out.print(fild.getName());
   // 动态获取属性值
   try{
    System.out.print("--------"+fild.get("hello,welcome!").toString());
   }catch(Exception e){
    System.out.println("不能访问!");
   }
  }
 } 
}


李绪成 CSDN Blog:http://blog.csdn.net/javaeeteacher
CSDN学生大本营:http://student.csdn.net/space.php?uid=124362
如果喜欢我的文章,就加我为好友:http://student.csdn.net/invite.php?u=124362&c=7be8ba2b6f3b6cc5

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值