反射

作者: kelaody | 来源:发表于2019-04-23 10:56 被阅读0次

概述:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
(class类是用来描述类的类)
事前准备:
建立一个Dog.java

package cn.myseudy.reflect;

public class Dog {
    public String name;
    public int age;
    protected int weight;
    private String gender;
    private String color;
    private String type;
    
    public void run() {
    }

    public void run(String name) {

    }

    public void run(String aaa, int bbb){
        System.out.println(aaa + "say:" + "我是" + bbb);
    }

    public static void eat() {
        System.out.println("吃东西,很开心!");
    }
    
    private void sleep() {
        System.out.println("睡觉不能被打扰!");
    }

    public int add(int a, int b) {
        return a + b;
    }
            
    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 int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Dog(String name, int age, int weight, String gender, String color, String type) {
        super();
        this.name = name;
        this.age = age;
        this.weight = weight;
        this.gender = gender;
        this.color = color;
        this.type = type;
    }

    public Dog() {
        super();
    }       
}

一、Class
1、创建Class实例化的三种方法
(由于Class类没有公共构造方法,所有创建Class的对象的方法有以下几种:)
准备:建立一个TestClass.java

package cn.myseudy.reflect;

public class TestClass {
    public static void main(String[] args) {
        try {
            //1、通过Class.forName()静态方法返回Class类的一个实例
            Class cls = Class.forName("cn.myseudy.reflect.Dog");
            //2、通过类名.class来获取一个Class类的实例
            Class cls2 = Dog.class;         
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

第三种:代码运行在非静态区,通过this.getClass()获取Class类的一个实例
例:在Dog.java中的类中加入

Class cls = this.getClass();

2、Class的具体操作

package cn.myseudy.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class TestClass2 {
public static void main(String[] args) {
        
        try {           
            Class cls = Class.forName("cn.myseudy.reflect.Dog");
            
            //类的属性
            //获取类名
            System.out.println(cls.getName());
            System.out.println(cls.getSimpleName());
            //获取类的修饰限定符
            int modi = cls.getModifiers();
            System.out.println(modi);
            
            //获取一个类的属性
            //根据一个属性名获取一个public属性的描述
            Field field = cls.getField("name");
            //获取一个类的全部public属性的描述
            Field[] fields = cls.getFields();
            System.out.println(fields.length);
            
            //根据一个属性名获取一个在类中声明的属性的描述
            Field declaredField = cls.getDeclaredField("gender");
            //获取所有在类中声明的属性的描述
            Field[] declaredFields = cls.getDeclaredFields();
            
            //获取一个类的方法
            //根据一个方法的名字获取类中的一个public的方法的描述
            Method method = cls.getMethod("run", String.class,int.class);
            //获取所有在类中是public的方法的描述
            Method[] methods = cls.getMethods();
            
            //根据一个方法名获取在类中声明的一个方法的描述
            Method declaredMethod = cls.getDeclaredMethod("eat", null);
            //获取所有在类中声明的方法的描述
            Method[] declaredMethods = cls.getDeclaredMethods();
            

            //返回cls所代表的类的实例
            Object obj = cls.newInstance();
            System.out.println(obj);
            
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }   
}

相关文章

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • 镜面反射矩阵的推导

    镜面反射是以镜面作为反射平面,实物与反射物到反射平面的距离相等,实物与反射物方向相反,所以,反射矩阵由反射平面确定...

  • reflect.go包学习_之二 指针操作提高反射性能 反射应用

    reflect.go包学习_之二 指针操作提高反射性能 反射应用 反射创建实例 反射信息、反射调用方法、反射修改值...

  • Java互联网公司-经典面试题附答案

    基础:Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?优点:反射具有解耦性,缺点:反射属...

  • Java反射与joor反射库的使用

    java原生反射的使用 反射构造对象 反射方法 反射字段 joor反射库的使用 github:https://gi...

  • Java反射

    什么是反射? 反射的作用? 反射性能优化?

  • 反射三定律

    反射第一定律:反射可以将interface类型变量转换成反射对象 反射第二定律:反射可以将反射对象还原成inter...

  • 反射

    1.反射是什么?反射的定义,概念 2.为什么要学反射? 3.怎么使用反射?反射的使用

  • 一周岁前做好两件事,孩子就不会语言迟缓,保证口齿伶俐

    与语言发展相关的原始反射有四个:张口反射、足跖反射、抓握反射和手拉反射,每个反射的发生、发展和整合都是次第进行的,...

  • 面试官问go反射第一弹

    目录 反射概念 reflect包 反射类型(Type)和种类(Kind) 反射类型(Type)使用 反射类型对象(...

网友评论

      本文标题:反射

      本文链接:https://www.haomeiwen.com/subject/fagmgqtx.html