java 反射机制常用方法

package com.Test.Demo.FanShe;

import java.lang.reflect.*;

public class FanShe {

    public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, InvocationTargetException {

        //一 :反射机制获取Class对象的三种方法及通过Class对象获取类对象
        Class c1 = Class.forName("java.lang.String"); // 1 : 通过Class类静态方法frName获取Class对象
        System.out.println(c1);
        Class c2 = String.class;  // 2 : 通过String属性Class获取Class对象
        System.out.println(c2);
        String s1 = "12w";
        Class c3 = s1.getClass(); // 3:通过实例化对象的getClass方法获取Class对象
        System.out.println(c3);
        Object obj = c1.newInstance();//通过Class对象获取类对象
        System.out.println();
        //二:包 java.lang.reflect  提供类和接口,以获取关于类和对象的反射信息
        Class c4 = Class.forName("com.Test.Demo.FanShe.A");
            //1、Constructor 构造函数对象
        Constructor[] constructors=c4.getConstructors();//获取Class对象的所有构造方法 只是获取了public构造方法
        for(Constructor t:constructors){
            System.out.println("构造方法方法名为:"+t.getName());
            System.out.println("构造方法修饰符为:"+Modifier.toString(t.getModifiers()));
            Class[] temp = t.getParameterTypes(); //获取构造方法的参数类型
            for(Class temp1:temp)
            System.out.println("构造方法的参数类型:"+temp1.getName());
        }
        System.out.println();
            //2、Method 普通方法
        //Method[] methods = c4.getMethods(); //获取Class对象所有的普通方法 只是获取了public方法
        Method[] methods = c4.getDeclaredMethods();//获取所有访问权限的方法
        Method method = c4.getDeclaredMethod("sum",int.class,int.class); //参数为方法名 参数类型 取得指定方法
        method.setAccessible(true);//打破该方法的封装
        System.out.print("sum方法执行结果:");
        method.invoke(new A(),1,2); //调用invoke方法 ,执行取得的方法 ,参数是实例化对象和执行方法的参数
        for(Method m1:methods){
            System.out.println("普通方法名称:"+m1.getName());
            System.out.println("普通方法修饰符:"+Modifier.toString(m1.getModifiers()));
            Class[] t1 = m1.getParameterTypes();
            System.out.println("普通方法参数类型:");
            for(Class temp:t1){
                System.out.println("\t"+temp.getName());
            }
            System.out.println("方法的返回值类型:"+m1.getReturnType().getName());
        }
        System.out.println();
            //3、Field 变量
       // Field[] fields = c4.getFields(); //只是获取了public类型变量
        Field[] fields = c4.getDeclaredFields(); //获取所有类型变量 getFields只能获取public字段
        System.out.println("变量的数量:"+fields.length);
        Field f = c4.getDeclaredField("c");//通过变量名获取变量
         System.out.println("是否取消执行安全检查"+f.isAccessible());//取消执行 则打破封装
        f.setAccessible(true);//打破该变量的封装
        A a = new A();//实例化一个A类对象 用于测试方法
        f.set(a,666);//将该a对象中的f变量的值设为666
        System.out.println("取得的变量为:"+f.getName()+" 值为:"+f.get(a));
        for(Field f1: fields){
            f1.setAccessible(true);// 参数为true则打破该封装
            System.out.println("变量的名称:"+f1.getName());
            System.out.println("变量修饰符:"+Modifier.toString(f1.getModifiers()));
            System.out.println("变量的类型:"+f1.getType().getName());
            System.out.println("变量的值:"+f1.get(a));
        }
        System.out.println();
        //4、Class
        Class[] c5 = c4.getInterfaces();
        for(Class t1 :c5){
            System.out.println("该类实现的接口:"+t1.getName());
        }
        System.out.println("该类的父类:"+c4.getSuperclass().getName());
        System.out.println("该类所在的包:"+c4.getPackage().getName());
        System.out.println("该类的名字:"+c4.getName());
        System.out.println("该类的简称:"+c4.getSimpleName());
        System.out.println("该类是否是接口:"+c4.isInterface());
    }
}
class A implements Runnable {
    public static String a="123";
    public String b;
    private int c;
    public A() {
    }
    public A(String a) {
        this.a = a;
    }
    public A(String a, String b) {
        this.a = a;
        this.b = b;
    }
    private void sum(int a,int b){
        System.out.println(a+b);
    }

    @Override
    public void run() {

    }
}

package com.Test.Demo.Test;

import sun.reflect.generics.scope.MethodScope;

import java.lang.reflect.*;

public class ReflectTest {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //三种获取Class对象的方法
        Class c1 = Class.forName("com.Test.Demo.Test.A");
        Class c2 = A.class;
        Class c3 = new A().getClass();
        //实例化Class对象的方法有两种 还可以通过获取Constructor的方法实例化
        A a1 = (A) c1.newInstance();
        //获取构造方法 并且测试方法
        Constructor[] constructor = c1.getDeclaredConstructors();//获取全部的构造方法
        Constructor   constructor1= c1.getConstructor(int.class,int.class);//获取指定参数类型的构造方法
        Constructor   constructor2=c1.getDeclaredConstructor(int.class);//获取指定参数类型的构造方法
        constructor2.setAccessible(true);//打破构造方法的封装
        A a3 = (A)constructor2.newInstance(3);//通过构造方法实例化对象
        Method method1 = c1.getDeclaredMethod("get");//获取指定名称的方法
        method1.setAccessible(true);//打破普通方法封装
        method1.invoke(a3);//普通方法执行
        A a2 = (A)constructor1.newInstance(2,5);//通过构造方法实例化对象
        Method method = c1.getDeclaredMethod("get");//获取指定名称的方法
        method.setAccessible(true);//打破普通方法封装
        method.invoke(a2);//普通方法执行
        System.out.println("------------------------------");
        for(Constructor temp : constructor){
            System.out.println("构造方法名:"+temp.getName());
            System.out.println("构造方法修饰符:"+ Modifier.toString(temp.getModifiers()));
            System.out.println("构造方法参数类型:");
            Class[] t1=temp.getParameterTypes();
            for(Class t2 : t1){
                System.out.print(t2.getName()+" ");
            }
            System.out.println();
        }
        System.out.println("------------------------------");
        Method[] methods = c1.getDeclaredMethods();
        Method   methodss= c1.getDeclaredMethod("get");//取得指定名称方法
        methodss.setAccessible(true);
        methodss.invoke(a2);
        for(Method method2 : methods){
            System.out.println("方法名称:"+method2.getName());
            System.out.println("方法修饰符:"+Modifier.toString(method2.getModifiers()));
            System.out.println("方法的返回值类型:"+method2.getReturnType());
            Class[] cc = method2.getParameterTypes();
            System.out.println("方法的参数类型:");
            for(Class ccc : cc){
                System.out.print(ccc.getName()+" ");
            }
            System.out.println();
        }
        Field[] fields = c1.getDeclaredFields();
        System.out.println(c1.getSimpleName()+"类中的变量数量:"+fields.length);
        Field   field = c1.getDeclaredField("b");
        field.setAccessible(true);
        field.set(a2,666);
        System.out.println("变量名:"+field.getName()+"变量的值:"+field.get(a2));
        System.out.println("变量的修饰符"+Modifier.toString(field.getModifiers()));
        System.out.println("变量的类型:"+field.getType());
        Class[] interfaces = c1.getInterfaces();
        System.out.println("该类实现的接口:");
        for(Class temp : interfaces){
            System.out.println(temp.getSimpleName());
        }
        System.out.println("该类的父类:"+c1.getSuperclass().getName());
        System.out.println("该类所在的包"+c1.getPackage());
        System.out.println("该类名字:"+c1.getName());
        System.out.println("该类名的简称:"+c1.getSimpleName());

    }
}
class A implements Runnable{
    public int a;
    private int b;

    public A() {
    }
    private A(int a){
        this.a=a;
    }
    public A(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public void setA(int a) {
        this.a = a;
    }

    public void setB(int b) {
        this.b = b;
    }

    public void math(int x, int y){
        System.out.println(x+y);
    }
    private void get(){
        System.out.println(this.b);
    }

    @Override
    public void run() {

    }
}

posted @ 2020-05-26 07:56  键盘_书生  阅读(36)  评论(0编辑  收藏  举报