美文网首页
Java之反射(20190108)

Java之反射(20190108)

作者: watayouxiang | 来源:发表于2019-01-09 00:15 被阅读3次

Java之反射(20190108)

源码:https://github.com/watayouxiang/JavaDemo

Person.java

package com.wata.javademo.reflect;

public class Person {
    private int age;
    private String name;
    
    public Person() {
        super();
    }

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

    @Override
    public String toString() {
        return "Person [age=" + age + ", name=" + name + "]";
    }
    
    
}

1. 获取字节码的三种方式

/**
 * 获取字节码的三种方式
 * 
 * @param args
 */
public static void main(String[] args) {

    // 1. Object类中的getClass()方法
    Person person = new Person();
    Class personClass1 = person.getClass();

    // 2. 任何数据类型都具有一个静态属性.class来获取对应的Class对象
    Class personClass2 = Person.class;

    // 3. 通过给定类的字符串名称获取(最常用)
    try {
        Class personClass3 = Class.forName("com.wata.javademo.reflect.Person");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

}

2. 获取Class中的构造函数

/**
 * 获取Class中的构造函数
 * 
 * @param args
 * @throws Exception
 */
public static void main(String[] args) throws Exception {

    // 寻找该名称类文件,并加载进内存,产生Class对象
    Class personClazz = Class.forName("com.wata.javademo.reflect.Person");

    // 通过空参数的构造函数进行对象的初始化
    Object person = personClazz.newInstance();
    System.out.println(person);

    // 获取指定的构造函数
    Constructor personConstructor = personClazz.getConstructor(int.class, String.class);
    // 通过该构造器newInstance()方法进行对象的初始化
    Object person2 = personConstructor.newInstance(18, "wata");
    System.out.println(person2);

}

3. 获取Class中的字段

/**
 * 获取Class中的字段
 * @param args
 * @throws Exception 
 */
public static void main(String[] args) throws Exception {

    // 获取Person的字节码
    Class personClazz = Class.forName("com.wata.javademo.reflect.Person");
    // 实例化Person对象
    Constructor personConstructor = personClazz.getConstructor(int.class, String.class);
    Object person = personConstructor.newInstance(21, "猪头");
    System.out.println(person);

    // 只能获取共有的
    // Field field = clazz.getField("name");

    // 获取Person的age字段(只能获取本类,但包含私有)
    Field nameField = personClazz.getDeclaredField("name");
    // 对私有字段的访问需要取消限制检查(也叫“暴力访问”)
    nameField.setAccessible(true);

    // 获取Person对象的Field值
    Object name = nameField.get(person);
    System.out.println(name);       
}

4. 获取Class中的方法

/**
 * 获取Class中的方法
 * 
 * @param args
 * @throws Exception
 */
public static void main(String[] args) throws Exception {

    Class personClazz = Class.forName("com.wata.javademo.reflect.Person");
    Constructor personConstructor = personClazz.getConstructor(int.class, String.class);
    Object person = personConstructor.newInstance(18, "猪头");

    // 获取所有的公有的方法
    Method[] methods = personClazz.getMethods();
    for (Method method : methods) {
        System.out.println(method);
    }

    System.out.println("=====================================");

    // 只获取本类中所有的方法,包含私有方法
    Method[] declaredMethods = personClazz.getDeclaredMethods();
    for (Method declaredMethod : declaredMethods) {
        System.out.println(declaredMethod);
    }

    System.out.println("=====================================");

    // 调用无参公有方法
    Method getNameMethod = personClazz.getMethod("getName", null);
    Object name = getNameMethod.invoke(person, null);
    System.out.println("name = " + name);

    System.out.println("=====================================");

    // 调用有参公有方法
    Method setNameMethod = personClazz.getMethod("setName", String.class);
    setNameMethod.invoke(person, "猪头头很大");
    System.out.println(person);

    System.out.println("=====================================");

    // 调用有参私有方法
    Method sayMethod = personClazz.getDeclaredMethod("say", String.class);
    sayMethod.setAccessible(true);// 取消访问限制,又叫“暴力访问”
    sayMethod.invoke(person, "猪年快乐~");

}

相关文章

  • Java之反射(20190108)

    Java之反射(20190108) 源码:https://github.com/watayouxiang/Java...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • Java基础之反射

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

  • java基础_反射

    相关文章 : 1. 公共技术点之 Java 反射 Reflection;2. Java反射原理简析;3. java...

  • Spring注解原理探索(三)

    之 Java如何识别注解 关键词:Java 反射java.lang.reflect 包,实现反射功能的工具类。注解...

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

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

  • 反射

    Java基础之—反射(非常重要)

  • Java学习笔记之反射机制

    title: Java学习笔记之反射机制tag: Javacategories: Java 理论介绍 为了便于理解...

  • 博客地址

    java注解-01、java注解-02、Git面试资源java反射-01、java反射-02、java反射-03为...

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

网友评论

      本文标题:Java之反射(20190108)

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