美文网首页
【java笔记】反射的简单应用

【java笔记】反射的简单应用

作者: 李明燮 | 来源:发表于2020-08-10 18:10 被阅读0次

今天在代码中看到了invoke方法,了解到原来是使用了反射的机制。
以前没怎么用过这种方式,所以简单的了解一下。

具体内容是简单的写了一套代码。

声明Animal类

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

class Animal {
    public Animal() {
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    private int age;
    public String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

普通的方法和使用反射

    @SuppressWarnings("unchecked")
    public void fanshe() throws Exception {
        try {
            System.out.println("-----------正常调用----------");
            Animal animal = new Animal();
            animal.setAge(10);
            System.out.println("animal age:" + animal.getAge());

            System.out.println("-----------使用反射----------");
            // 获取需调用的类
            Class clz = Class.forName("Animal");
            // 获取需调用的函数
            Method setPriceMethod = clz.getMethod("setAge", int.class);
            // 根据class的实例,获取Constructor实例
            Constructor animalConstructor = clz.getConstructor();
            // 根据Constructor实例的newInstance(),获取反射类
            Object animalObj = animalConstructor.newInstance();
            // 使用invoke方法调用反射类的函数
            setPriceMethod.invoke(animalObj, 15);
            // 只调用方法,只需要下面两个步骤
            Method getPriceMethod = clz.getMethod("getAge");
            Object age = getPriceMethod.invoke(animalObj);
            System.out.println("animal age:" + age);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

反射的常用方法

    @SuppressWarnings("unchecked")
    public void fansheTest() throws Exception {
        try {
            // 使用.forName 获取类的对象
            Class clz1 = Class.forName("java.lang.String");
            System.out.println("-----------Class1----------");
            System.out.println(clz1);


            // 使用 .class 获取类的对象
            Class clz2 = String.class;
            System.out.println("-----------Class2----------");
            System.out.println(clz2);

            // 实例的 .getClass 获取类对象
            String str = new String("Hello");
            Class clz3 = str.getClass();
            System.out.println("-----------Class3----------");
            System.out.println(clz3);


            // 获取反射类,直接调用class的 newInstance()方法获取
            Class clz4 = Animal.class;
            Animal animal4 = (Animal) clz4.newInstance();
            System.out.println("-----------Class4----------");
            System.out.println(animal4.getClass());

            // 获取反射类,通过Constructor的newInstance()方法获取
            Class clz5 = Animal.class;
            Constructor constructor5 = clz5.getConstructor();
            Animal animal5 = (Animal) constructor5.newInstance();
            System.out.println("-----------Class5----------");
            System.out.println(animal5.getClass());

            // 获取反射类,指定构造函数的时候
            Class clz6 = Animal.class;
            Constructor constructor6 = clz4.getConstructor(String.class, int.class);
            Animal animal6 = (Animal) constructor6.newInstance("马", 15);
            System.out.println("-----------Class6----------");
            System.out.println(animal6.getClass());


            Class clz = Animal.class;
            // 获取类的属性(查不到private属性)
            Field[] fields1 = clz.getFields();
            System.out.println("-----------fields1----------");
            for (Field field : fields1) {
                System.out.println(field.getName());
            }

            // 获取声明的类所有属性
            System.out.println("-----------fields2----------");
            Field[] fields2 = clz.getDeclaredFields();
            for (Field field : fields2) {
                System.out.println(field.getName());
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

main里执行

public class main {
    public static void main(String[] args){
        Animal animal = new Animal();
        try{
            animal.fanshe();
            animal.fansheTest();
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}

编译以后,可以查看结果

$ javac main.java

$ java main
-----------正常调用----------
animal age:10
-----------反射调用----------
animal age:15
-----------Class1----------
class java.lang.String
-----------Class2----------
class java.lang.String
-----------Class3----------
class java.lang.String
-----------Class4----------
class Animal
-----------Class5----------
class Animal
-----------Class6----------
class Animal
-----------fields1----------
name
-----------fields2----------
age
name

欢迎大家的意见和交流

email: li_mingxie@163.com

相关文章

  • 【java笔记】反射的简单应用

    今天在代码中看到了invoke方法,了解到原来是使用了反射的机制。以前没怎么用过这种方式,所以简单的了解一下。 具...

  • 安卓反射和动态代理的应用

    提纲 java反射基础 反射在Android中的应用 Java动态代理 动态代理在Android的应用 java反...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Android Kotlin 反射使用笔记

    前言 java反射的写法,做下笔记 反射用法

  • 反射之三

    总结内容源自以下文章 粗浅看java反射机制 反射机制应用实践 谈谈java反射机制 Java Reflectio...

  • Chapter 13 . 反射机制

    阅读原文 Chapter 13 . 反射机制 13.1 Java反射机制研究及应用 Java Reflection...

  • [JAVA学习笔记] 反射机制

    [JAVA学习笔记] 反射机制 Java的反射通过Class类和java.lang.reflect类库实现。通过它...

  • 【转】Java编程学习之反射技术及其应用

    【转】Java编程学习之反射技术及其应用 (原文链接:java编程学习之反射技术及其应用) 说明:原文中给出的代码...

  • JAVA 反射应用

    什么是反射? 最简单的理解,可以将"ClassName"转换成一个真正的对象。可以动态的调用某个函数,创建某个类。...

网友评论

      本文标题:【java笔记】反射的简单应用

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