zoukankan      html  css  js  c++  java
  • Java之反射代码演示说明

    还不存在的类–即我们需要使用反射来使用的类

    Person类:

    package com.qf.demo4;
    
    public class Person {
    
        private String name;
        public int age;
        static int weight;
        int male;
        protected int num;
    
        public Person(String name, int age, int weight) {
            this.name = name;
            this.age = age;
            this.weight = weight;
            System.out.println("有参数的构造方法");
        }
    
        public Person() {
            System.out.println("无参数的构造方法");
        }
    
        public void eat() {
            System.out.println("吃");
        }
    
        public void drink(String type) {
            System.out.println("喝" + type);
        }
    
        public String sleep() {
            System.out.println("睡");
            return "呵呵";
        }
    
        private void play() {
            System.out.println("玩");
        }
    
        public static void hehe() {
            System.out.println("heheheheh");
        }
    
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + ",weight = "+weight+"]";
        }
    }
    

    演示代码:


    Test1:创建Class对象

    package com.qf.demo4;
    
    import com.qf.demo.Person;
    /**
     * 每一个类只有一个class 对象
     * com.qf.demo.Person 包名+类名  全限定名
     * @author Administrator
     *
     */
    public class Test {
    
        public static void main(String[] args) {
            // 创建Class 对象
            // 第一种方式:类.class
            Class class1 = Person.class;
            System.out.println(class1.hashCode());
            // 第二种方式:创建类的对象;然后--对象.getClass()
            Person person = new Person();
            Class class2 = person.getClass();
            System.out.println(class2.hashCode());
    
    
            // 第三种方式:使用forname方法,参数为相对于本工程的地址
            try {
                Class class3 = Class.forName("com.qf.demo.Person");
                System.out.println(class3.hashCode());
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    

    Test2:创建Constructor对象,并创建Person类(还没有的类)对象

    package com.qf.demo4;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    
    public class Test2 {
    
        public static void main(String[] args) {
    
            try {
                Class class1 = Class.forName("com.qf.demo4.Person");
                Constructor[] constructors = class1.getConstructors();
                for (Constructor constructor : constructors) {
                    System.out.println(constructor);
                }
    
    
                // 1 通过构造方法创建  Perosn对象
                Constructor constructor = class1.getConstructor(null);// 得到无参的构造方法
                Person person = (Person) constructor.newInstance(null);
                System.out.println(person);
    
    
                // 2 利用有参数的构造方法创建对象
                Constructor constructor2 = class1.getConstructor(String.class,int.class,int.class);
                Person person2 = (Person) constructor2.newInstance("张三",5,9);
                System.out.println(person2);
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    

    Test3:获取方法,以及调用方法

    package com.qf.demo4;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class Test3 {
    
        public static void main(String[] args) {
            try {
                Class class1 = Class.forName("com.qf.demo4.Person");
                // 得到构造方法
                Constructor constructor = class1.getConstructor(null);
                Object object = constructor.newInstance(null);
    
                Method[] methods = class1.getMethods();// 得到本类和父类的非私有的方法
    
                Method[] methods2 = class1.getDeclaredMethods();// 得到本类中声明的所有的方法(包括私有)
    
                // 得到 无参  无返回值的 方法并且调用
                Method method = class1.getMethod("eat", null);
                //            调用方法的对象    实际参数
                method.invoke(object, null);// 是哪个方法被调用
    
                // 调用  有参数 无返回值的方法
                Method method2 = class1.getMethod("drink", String.class);
                method2.invoke(object, "水");
    
                // 有返回值的
                Method method3 = class1.getMethod("sleep", null);
                Object  object2 = method3.invoke(object, null);// invoke方法的返回值就是调用的方法的返回值
                System.out.println(object2);
    
                // 得到静态的方法
                Method method4 = class1.getMethod("hehe", null);
                method4.invoke(null, null);// 静态方法不需要传递对象  直接写null
    
    
                // 私有的   私有的方法 必须用 getDeclaredMethod 才能得到
                Method method5 = class1.getDeclaredMethod("play", null);
                method5.setAccessible(true);// 私有方法默认没有权限调用,必须单独设定调用权限
                method5.invoke(object, null);
    
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    

    反射定义:http://blog.csdn.net/baidu_37107022/article/details/71234940

  • 相关阅读:
    怎样把.git版本控制文件夹放在项目目录下
    mybatis3-generator-plugin插件地址
    @RestController
    <mvc:annotation-driven />注解意义
    关于Spring中的<context:annotation-config/>配置
    Jeecg-Boot前后端分离,针对敏感数据,加密传递方案
    微信开发SDK支持小程序 ,Jeewx-Api 1.3.1 版本发布
    Mybatis传递多个参数的4种方式(干货)
    Online开发初体验——Jeecg-Boot 在线配置图表
    JAVA开源微信管家平台——JeeWx捷微V3.3版本发布(支持微信公众号,微信企业号,支付窗)
  • 原文地址:https://www.cnblogs.com/TCB-Java/p/6853996.html
Copyright © 2011-2022 走看看