反射


反射方法总结
类是Class的对象
第一种方式:
Class clazz=Class.forName("demo4.UserInfo")
第二种方式:
Class clazz=UserInfo.class
第三种方式:
Class clazz=new UserInfo().getClass();

--常见方法总结:
clazz.getPackage() 返回值是Package对象,获取包
clazz.getName() 返回值String,获取完整类名
clazz.getSimpleName() 返回值String 获取完整类名
clazz.getFields/getField(String 字段名) 返回值 Field获取类中的字段(包括父类的)
clazz.getDeclaredFields/getDeclaredField(String 字段名) 返回值 Field 仅仅获取类的字段
clazz.getSuperclass() 返回值Class 获取父类
clazz.getInterfaces() 返回Class[] 获取实现的接口
clazz.getMethods/getMethod(String 方法名,Class 形参类型) 获取方法(包括父类的方法)
clazz.getDeclaredMethods/getDeclaredMethod(String 方法名,Class 形参类型) 获取当前类的方法,不包括父类
method.invoke(Object obj) 执行方法 返回值Object
method.getReturnType() 返回值Class 获取方法的返回值类型
method.getParameterTypes() 返回值Class[] 获取方法的形参数组
field.get(Object) 获取字段的值 返回值Object
field.set(Object,value) 给字段赋值
field.getType() 返回值Class 获取字段类型
field.getModifiers() 获取字段的访问修饰符码 十六进制
Modifier.toString(int) 将code返回成真实的修饰符 private
clazz.newInstance():创建类的实例
clazz.getConstructors(): 返回值Constructor[] 获取类中的所有构造
clazz.getConstructor(Class) 获取单个构造器 返回值Constructor
Constructor.newInstance(Object) 运行构造器 返回值是类的实例
clazz.getAnnotions() Annotion[] 获取所有注解

 

package Demo4;

import java.io.Serializable;

public class UserInfo implements Serializable,Runnable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    public UserInfo() {
        System.out.println("wu参构造已执行");
    }
    
    public UserInfo(String name, int age) {
        System.out.println("带参构造已执行");
        this.name = name;
        this.age = age;
    }
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
     public String say(String text){
            return "你好,我叫小张!"+text;
        }
        
        
}

 

 

package demo4;

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;
import java.lang.reflect.TypeVariable;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class MyTest {
    public static void main(String[] args) throws Exception {
         //No.1
        Class forName = Class.forName("demo4.UserInfo");
        //        //No.2
        //        Class clazz=UserInfo.class;
        //        //No.3
        //        Class class1 = new UserInfo().getClass();
         getPackageAndClassName(forName);
         System.out.println("-----------------------------------");
         getClassFields(forName);
         System.out.println("-----------------------------------");
         getSuperClassAndInterface(forName);
         System.out.println("-----------------------------------");
         getClassMethod(forName);
         System.out.println("-----------------------------------");

         getClassConstructor(forName);
         System.out.println("-----------------------------------");

         getClassAnnotion(forName);

    }
    
    //包名和类名同时获取
    public static void getPackageAndClassName(Class clazz){
            Package pack = clazz.getPackage();
            System.out.println("包名为:"+pack.getName());
            System.out.println("类的全名为:"+clazz.getName());
            System.out.println("类名:"+clazz.getSimpleName());
    }
    //获取类中的字段
    public static void getClassFields(Class clazz) throws Exception{
           //1、getDeclaredFields() 只能获取当前类的字段
                    Field[] declaredFields = clazz.getDeclaredFields();
                    //不知道类名的情况下也可以创建类的对象
                    Object obj = clazz.newInstance();
                    for (Field field : declaredFields) {
                          field.setAccessible(true);
                          System.out.println(field.getName()); 
                          //取出字段保存的值
                          System.out.println(field.get(obj));
                    }
                    Field field = clazz.getDeclaredField("age");
                    field.setAccessible(true);
                    //给字段赋值
                    field.set(obj, 12);
                   System.out.println("赋值成功!值为:"+ field.get(obj));
                   //获取age字段的数据类型
                   Class<?> type = field.getType();
                   System.out.println("age字段的数据类型是:"+type.getName());
                   //获取访问修饰符
                   int code = field.getModifiers();
                   System.out.println("该字段的访问修饰符是:"+Modifier.toString(code));
      }
        //3:获取类的父类以及实现的接口
        public static void getSuperClassAndInterface(Class clazz){
                System.out.println("该类的父类是:"+clazz.getSuperclass().getName());
                System.out.println("该类实现的接口有:");
                Class[] clazzs = clazz.getInterfaces();
                for (Class class1 : clazzs) {
                    System.out.println("接口名称:"+class1.getName());
                }
        }
        //4:获取类中的方法
        public static void getClassMethod(Class clazz) throws Exception{
               //可以获取从父类继承过来的方法
                Method[] methods = clazz.getMethods();
                System.out.println(methods.length);
                for (Method method : methods) {
                    System.out.println("类和父类的方法有:"+method.getName());
                }
                System.out.println("--------------------------------------------------------");
                //获取当前类的方法
                Method[] declaredMethods = clazz.getDeclaredMethods();
                for (Method method : declaredMethods) {
                       System.out.println("该类的方法有:"+method.getName());
                }
                //获取单个方法
                Method method = clazz.getDeclaredMethod("say",String.class);
                //获取方法的返回值
                Class  clazzs = method.getReturnType();
                System.out.println("该方法的返回值是"+clazzs.getName());
                //获取方法的形参类型
                Class[] params = method.getParameterTypes();
                for (Class class1 : params) {
                    System.out.println("形参有:"+class1.getName());
                }
                //不知道类名的情况下也可以创建类的对象
                Object obj = clazz.newInstance();
                //invoke让method对象执行
                Object obj1= method.invoke(obj, "我是狗");
                System.out.println("方法执行后的结果是:"+obj1);
        }
        
        //5:获取构造
        public static void getClassConstructor(Class clazz) throws Exception{
            //获取所有构造器
              Constructor[] constructors = clazz.getConstructors();
              for (Constructor constructor : constructors) {
                    System.out.println(constructor.getName());
              }
              //获取单个构造器
              Constructor constructor = clazz.getConstructor(String.class,int.class);
              //执行构造器,返回类的实例
              Object obj = constructor.newInstance("呵呵",12);
        }
       //6:获取注解
         public static void getClassAnnotion(Class clazz) throws Exception{
                   Method method = clazz.getDeclaredMethod("getAge");
                   Annotation[] annotations = method.getAnnotations();
                   for (Annotation annotation : annotations) {
                      System.out.println("该方法的注解有:"+annotation.toString());
                }
         }
}

 


posted @ 2017-08-01 21:10  春眠不觉笑  阅读(207)  评论(0编辑  收藏  举报