反射(二)

一,通过Class类取得类的完整结构

1.1 在Class类中存在以下的方法,可以取得一个类继承的父类

public Class<? super T> getSuperclass()

1.2 取得实现的全部接口

public Class<?>[] getInterfaces()

1.3 取得一个类的全部构造方法

public Constructor<?>[] getConstructors()

得到访问修饰符:public int getModifiers()

得到全部的参数:public Class<?>[] getParameterTypes()

在实际的开发中所有的访问权限基本上都是以数字的形式表示出来的,对于public,private而言本身也是对应着一个数字,而且对于public static final,实际上是属于三个值相加的结果,所以,如果要想正确的还原一个方法的访问修饰符,则必须是用一个Modifer的类进行还原,在该类中存在方法:

public static String toString(int mod)

还原访问修饰符

1.4取得一个类的全部方法

public Methos[] getMethods()

得到方法的返回值类型:public Class<?>  getReturnType()

取得方法的全部参数:public Class<?>[]  getParameterTypes()

取得方法的抛出异常:public Class<?>[]  getExceptionTypes()

1.5取得一个类中的全部属性

得到继承而来的公共属性:public Field[] getFields()

得到自定义的属性:public Field[] getDeclaredFields()

得到属性的数据类型:getType()

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;


interface info
{
 public String getInfo();
 public String say(String name,String content);
 public void sayHello();
}
class Person implements info
{
 private String name;
 private int age;
 public Person(){}
 public Person(String name)
 {
  this.name=name;
 }
 public Person(String name,int age)
 {
   this(name);
   this.age=age;
 }
 public String getInfo() {
  return "Hello";
 }
 public String say(String name, String content) {
  return "world";
 }
 public void sayHello() {
  System.out.println("new Year!");
 }
}
public class ReflectDemo {
 public static void main(String args[]) throws Exception
 {
  //取得继承的父类
  Class<?> c=Class.forName("Person");
  Class<?> sc=c.getSuperclass();
  System.out.println(sc.getName());
  //取得实现的全部接口
  Class<?> ic[]=c.getInterfaces();
  for(Class<?> iic:ic)
  {
   System.out.println(iic.getName());
  }
  //取得一个类的全部构造方法
  Constructor<?> cc[]=c.getConstructors();
  for(Constructor c1:cc)
  {
   //得到修饰符对应的值
   int mod=c1.getModifiers();
   //还原访问修饰符
   String md=Modifier.toString(mod);
   //得到全部参数
   Class<?> param[]=c1.getParameterTypes();
   System.out.println(md+" "+c1.getName()+"(");
   for(int i=0;i<param.length;i++)
   {
    System.out.println(param[i].getName()+",");
   }
   System.out.println(")");
  }
  //取得一个类的全部方法
  Method[] mc=c.getMethods();
  for(Method m:mc)
  {
   System.out.println(m.getReturnType()+m.getName());
  }
 } 
}

原文地址:https://www.cnblogs.com/jinzhengquan/p/1948880.html