李绪成的一亩三分地

——忙着,快乐着 《Java语言程序设计(Java7)——入门与提高篇》出版发行,清华大学出版社,2014.2...

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

阅读更多
想对作者说点什么? 我来说一句

Java反射机制 Java反射机制

2008年12月28日 20KB 下载

java反射机制与动态代理

2010年03月28日 250KB 下载

Java反射机制课件ppt

2010年06月28日 268KB 下载

JAVA 反射机制应用

2008年10月17日 124KB 下载

java反射原理

2011年07月04日 450KB 下载

java反射机制教程

2009年07月24日 202KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭