`

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("不能访问!");
   }
  }
}
}
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics