zoukankan      html  css  js  c++  java
  • 反射的相关知识汇总

    1反射机制是什么

    反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

    2反射机制能做什么

    反射机制主要提供了以下功能: 

    • 在运行时判断任意一个对象所属的类;

    • 在运行时构造任意一个类的对象;

    • 在运行时判断任意一个类所具有的成员变量和方法;

    • 在运行时调用任意一个对象的方法;

    • 生成动态代理。

    3反射机制的相关API

    通过一个对象获得完整的包名和类名

    实例化Class类对象

    public class test_3 {
        public static void main(String[] args) throws ClassNotFoundException {
            Class<?> class1 = Class.forName("com.training.Book");
            Class<?> class2 = new Book().getClass();
            Class<?> class3 = Book.class;
            System.out.println(class1.getName());
            System.out.println(class2.getName());
            System.out.println(class3.getName());
        }
    }
    
    class Book{
        String title;
        double price;
        public Book() {
            // TODO Auto-generated constructor stub
        }
        public Book(String title,double price) {
            // TODO Auto-generated constructor stub
            this.title=title;
            this.price=price;
        }
        public void print(){
            System.out.println("111");
        }
        public void fun(){}
    }

    基础代码:

    class Book{
        String title;
        double price;
        public Book() {
            // TODO Auto-generated constructor stub
        }
        public Book(String title,double price) {
            // TODO Auto-generated constructor stub
            this.title=title;
            this.price=price;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        public void setPrice(double price) {
            this.price = price;
        }
        public String getTitle() {
            return title;
        }
        public double getPrice() {
            return price;
        }
        public void print(){
            System.out.println("111");
        }
        public void fun(){}
    }
    
    
    interface BookMaker{
        public static final String AUTHORD="Redick";
        public static final String DATE="20170330";
        public abstract String publiched();
    }
    
    class StudyBook extends Book implements BookMaker{
        private String name;
        public StudyBook() {
            // TODO Auto-generated constructor stub
        }
        public StudyBook(String name) {
            // TODO Auto-generated constructor stub
            this.name=name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        @Override
        public String publiched() {
            // TODO Auto-generated method stub
            return "已出版的书名为:" +this.title+"
    "+"价格为:"+this.price+"
    "+"小名为:"+this.name;
        }
        
        @Override
        public void print() {
            // TODO Auto-generated method stub
            super.print();
        }
        public void sell(int num){
            System.out.println("卖了"+num+"本书");
        }
        
    }

    获取该类的父类和接口:

    public class test_3 {
        public static void main(String[] args) throws ClassNotFoundException {
            Class<?> class1 = Class.forName("com.training.StudyBook");
            Class<?> con1 = class1.getSuperclass();
            Class<?> con2[] = class1.getInterfaces();
            System.out.println("父类:"+con1.getName());
            for(int i=0;i<con2.length;i++){
                System.out.println("接口:" +con2[i].getName());
            }
            
        }
    }

    获取所有的构造函数和其对应的参数:

    public class test_3 {
        public static void main(String[] args) throws ClassNotFoundException {
            Class<?> class1 = Class.forName("com.training.StudyBook");
            Constructor<?> con1[] = class1.getConstructors();
            for(int i=0;i<con1.length;i++){
                System.out.print("构造函数"+(i+1)+":"+con1[i].getName());
                Class<?> para[] = con1[i].getParameterTypes();
                System.out.print("	"+"此构造函数的参数为:");
                if(para.length!=0){
                    for(int j=0;j<para.length;j++){
                        System.out.print(para[j].getName()+"、");
                    }
                }else{
                    System.out.print("该构造函数没有参数");
                }
                System.out.println();
            }
            
        }
    }

    利用反射实例化对象:

    public class test_3 {
        public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
            Class<?> class1 = Class.forName("com.training.StudyBook");
            StudyBook ssBook = (StudyBook)class1.newInstance();
        }
    }

    获取类的全部属性:

    public class test_3 {
        public static void main(String[] args) throws ClassNotFoundException {
            Class<?> class1 = Class.forName("com.training.StudyBook");
            //getFields()返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
            Field ffField[] = class1.getFields();
            System.out.println("getFields()");
            for(int i=0;i<ffField.length;i++){
                System.out.println(ffField[i].getName());
            }
            
            //getDeclaredFields() 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
            Field ssField[] = class1.getDeclaredFields();
            System.out.println("getDeclaredFields()");
            for(int j=0;j<ssField.length;j++){
                System.out.println(ssField[j].getName());
            }
            
        }
    }

    通过反射调用某个方法:

    public class test_3 {
        public static void main(String[] args) throws Exception {
            Class<?> class1 = Class.forName("com.training.StudyBook");
            
            Method mm2 =class1.getMethod("print");
            mm2.invoke(class1.newInstance());
            //针对有参数的方法的调用
            Method mm1 = class1.getMethod("sell", int.class);
            mm1.invoke(class1.newInstance(), 22);
        }
    }

    反射设计工厂模式:

    package com.training;
    public class test_3 {
        public static void main(String[] args) throws Exception {
            Factory.getInstance("com.training.Apple").eat();
        }
    }
    
    interface Fruit{
        public abstract void eat();
    }
    
    class Apple implements Fruit{
        public void eat() {
            // TODO Auto-generated method stub
            System.out.println("吃苹果");
        }
    }
    
    class Orange implements Fruit{
        @Override
        public void eat() {
            // TODO Auto-generated method stub
            System.out.println("吃橘子");
        }
    }
    
    class Factory{
        public static Fruit getInstance(String className) {
            Class<?> instance = null;
            try {
                instance=Class.forName(className);
                return (Fruit)instance.newInstance();
            } catch (Exception e) {
                // TODO: handle exception
                return null;
            }
        }
    }
  • 相关阅读:
    linux 使用crontab定时任务+shell脚本删除tomcat日志elasticsearch日志索引
    【转】Java8 Stream 流详解
    Mongo查询list数组中一个字段大于特定条数
    安装Elasticsearch出现 node validation exception 的问题处理
    mockito使用教程
    rocketmq4.4配置日志路径等级
    使用ResponseBodyAdvice统一包装响应返回String的时候出现java.lang.ClassCastException: com.xxx.dto.common.ResponseResult cannot be cast to java.lang.String
    服务器22端口连接超时 ssh: connect to host *** port 22: Operation timed out
    【JAVA基础】24 递归练习
    【JAVA基础】23 IO流-其他流
  • 原文地址:https://www.cnblogs.com/redick/p/6647630.html
Copyright © 2011-2022 走看看