zoukankan      html  css  js  c++  java
  • 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("	"+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() {
    
        }
    }
    
    
  • 相关阅读:
    函数模板
    三次握手四次分手
    多态
    函数指针与多态
    继承和派生
    使用ntp 实现时间同步
    Hadoop之Mapreduce 程序
    hadoop学习笔记二
    hadoop学习笔记 一
    大数据知识和资料总结
  • 原文地址:https://www.cnblogs.com/fxzemmm/p/14847954.html
Copyright © 2011-2022 走看看