Java反射获取class对象方式解析

1、获取Class对象

在 Java API 中,提供了获取 Class 类对象的三种方法:

第一种,使用 Class.forName 静态方法。

前提:已明确类的全路径名。

第二种,使用 .class 方法。

说明:仅适合在编译前就已经明确要操作的 Class

第三种,使用类对象的 getClass() 方法。

适合有对象示例的情况下

User类

package com.reflection;

/**
 * Created by Liuxd on 2018-08-15.
 */
public class User {
  private String name;
  private Integer age;

  public User() {
  }

  public User(String name, Integer age) {
    this.name = name;
    this.age = age;
  }

  public String getName() {
    return name;
  }

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

  public Integer getAge() {
    return age;
  }

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

  @Override
  public String toString() {
    return "User{" +
        "name='" + name + '\'' +
        ", age=" + age +
        '}';
  }
}
package com.reflection;

/**
 * Created by Liuxd on 2018-08-15.
 */
public class TestReflection {

  public static void main(String[] args) {
//   第一、通过Class.forName方式
    Class clazz1 = null;
    try {
      clazz1 = Class.forName("com.reflection.User");
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }

//   第二、通过对象实例方法获取对象
    Class clazz2 = User.class;

//   第三、通过Object类的getClass方法
    User user = new User();
    Class clazz3 = user.getClass();

    System.out.println(clazz1);
    System.out.println(clazz2);
    System.out.println(clazz3);
  }
}

2、获取对象实例

共两种方法:

一、直接用字节码文件获取对应实例

// 调用无参构造器 ,若是没有,则会报异常
Object o = clazz.newInstance();

二、有带参数的构造函数的类,先获取到其构造对象,再通过该构造方法类获取实例:

//获取构造函数类的对象
Constroctor constroctor = clazz.getConstructor(String.class,Integer.class);
// 使用构造器对象的newInstance方法初始化对象
Object obj = constroctor.newInstance("龙哥", 29); 
package com.reflection;
import java.lang.reflect.Constructor;
/**
 * Created by Liuxd on 2018-08-15.
 */
public class TestReflection {

  public static void main(String[] args) {
//   第一、通过Class.forName方式
    Class clazz1 = null;
    try {
      clazz1 = Class.forName("com.reflection.User");
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }

//   第二、通过对象实例方法获取对象
    Class clazz2 = User.class;

//   第三、通过Object类的getClass方法
    User user = new User();
    Class clazz3 = user.getClass();
    System.out.println(clazz1);
    System.out.println(clazz2);
    System.out.println(clazz3);
    User user1 = null;
    try {
       user1 =(User) clazz1.newInstance();
    } catch (InstantiationException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    }
    user1.setName("终结者");
    user1.setAge(1500);
    System.out.println("user1:"+user1.toString());
    User user2 = null;
    try {
      // 获取构造函数
      Constructor constroctor = clazz2.getConstructor(String.class,Integer.class);
      // 通过构造器对象的newInstance方法进行对象的初始化
      user2 = (User) constroctor.newInstance("龙哥",29);
    } catch (Exception e) {
      e.printStackTrace();
    }
    System.out.println("user2:"+user2.toString());
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java 采用反射获取class属性值的实现代码

    原理:Java的反射能够获取属性的名称,然后通过invoke调用类的某个方法.比如有个属性叫userName,这个类写了个方法叫getUserName,通过invoke调用getUserName这个方法.代码如下 复制代码 代码如下: import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.HashMap;import java.util.Map;public class ParameterB

  • IntelliJ IDEA引入第三方jar包或查看Java源码的时候报decompiled.class file bytecode version:52.0(java 8)错误的解决办法

    引入第三方jar包或者查看Java源码的时候,经常遇到问题如下: decompiled.class file bytecode version:52.0(java 8) ,open source file. 翻译一下上面的意思:(反编译 .class文件中的字节码 到Java 8 版本) 打开源文件 其实这个时候,你就得注意一下,你看到文件是 .class文件,还是 .java文件. 然后我就详细的总结了一下,二者的差别: 1.先是理论知识: .java为Java的源文件后缀,编写的代码需要写在

  • Java中通过Class类获取Class对象的方法详解

    前言 本文主要给大家介绍的是关于Java通过Class类获取Class对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 阅读API的Class类得知,Class 没有公共构造方法.Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的 获取Class对象的三种方式(实例采用Person类) 方式1:通过Object类的getObject()方法 Person p = new Person(); Class c

  • 简单了解JAVA中类、实例与Class对象

    类 类是面向对象编程语言的一个重要概念,它是对一项事物的抽象概括,可以包含该事物的一些属性定义,以及操作属性的方法.面向对象编程中,我们都是以类来编码. 实例 简单理解,就是new,就是对类的实例化,创建这个类对应的实际对象,类只是对事物的描述,而实例化就相当于为这个描述新开辟了一块内存,可以改变这块区域里的各种属性(成员变量),当然,也可以实例化多块区域,只是不同的对象而已. Class 注意这里C大写了,与类概念区分开,在java里,Class是一个实实在在的类,在包 java.lang 下

  • Java反射学习 getClass()函数应用

    Java反射学习 所谓反射,可以理解为在运行时期获取对象类型信息的操作.传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性的代码.严格地说,反射并非编程语言的特性,因为在任何一种语言都可以实现反射机制,但是如果编程语言本身支持反射,那么反射的实现就会方便很多. 1,获得类型类 我们知道在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类.Object类中包含一个方法名叫getClass,利用这个方

  • 基于Java class对象说明、Java 静态变量声明和赋值说明(详解)

    先看下JDK中的说明: java.lang.Object java.lang.Class<T> Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class tha

  • JAVA反射机制中getClass和class对比分析

    java有两个获得类名的方法getClass()和class(),这两个方法看似一样,实则不然.这两个方法涉及到了java中的反射. 所谓反射,可以理解为在运行时期获取对象类型信息的操作.传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性的代码.严格地说,反射并非编程语言的特性,因为在任何一种语言都可以实现反射机制,但是如果编程语言本身支持反射,那么反射的实现就会方便很多. 类型类 要知道类型信息在运行时是如何表示的,这是

  • Java反射获取class对象方式解析

    1.获取Class对象 在 Java API 中,提供了获取 Class 类对象的三种方法: 第一种,使用 Class.forName 静态方法. 前提:已明确类的全路径名. 第二种,使用 .class 方法. 说明:仅适合在编译前就已经明确要操作的 Class 第三种,使用类对象的 getClass() 方法. 适合有对象示例的情况下 User类 package com.reflection; /** * Created by Liuxd on 2018-08-15. */ public cl

  • java反射获取一个object属性值代码解析

    有些时候你明明知道这个object里面是什么,但是因为种种原因,你不能将它转化成一个对象,只是想单纯地提取出这个object里的一些东西,这个时候就需要用反射了. 假如你这个类是这样的: private class User { String userName; String userPassword; public String getUserName() { return userName; } public void setUserName(String userName) { this.

  • 利用Java反射机制实现对象相同字段的复制操作

    一.如何实现不同类型对象之间的复制问题? 1.为什么会有这个问题? 近来在进行一个项目开发的时候,为了隐藏后端数据库表结构.同时也为了配合给前端一个更友好的API接口文档(swagger API文档),我采用POJO来对应数据表结构,使用VO来给传递前端要展示的数据,同时使用DTO来进行请求参数的封装.以上是一个具体的场景,可以发现这样子一个现象:POJO.VO.DTO对象是同一个数据的不同视图,所以会有很多相同的字段,由于不同的地方使用不同的对象,无可避免的会存在对象之间的值迁移问题,迁移的一

  • Java反射获取实例的速度对比分析

    之前代码有一个逻辑,是在初始化时读取某个包下的所有class文件,放入到一个HashMap里.代码运行过程中,通过Key获取到对应class的全路径名,最后通过Class.forName(className).getDeclaredConstructor().newInstance()获取实例对象. 后来同事看到了代码,对这个HashMap里存储方式提出了建议,之前的Map是<String,String>完全可以改成<String,Class> 后来我测试了一下两者实例化一个对象的

  • Java 反射获取类详细信息的常用方法总结

    类ReflectionDemo 复制代码 代码如下: package Reflection; @Deprecated public class ReflectionDemo {     private String pri_field;     public String pub_field;     public ReflectionDemo(){}     public ReflectionDemo(String name){}     private ReflectionDemo(Stri

  • java反射获取和调用方法

    Class类中获取方法: public Method[] getMethods();//获取包括自身和继承(实现)过来的所有的public方法--Method不支持泛型<>,即后面不接<> public Method[] getDeclaredMethods();//获取自身所有的方法(private.public.protected,和访问权限无关),不包括继承的 在jdk1.8后可以直接获取私有属性的方法不需要设置权限 但是仅限于getDeclaredMethod方法 对于Me

  • java反射获取包下所有类的操作

    我就废话不多说了,大家还是直接看代码吧~ public static void main(String[] args) { try { // 获取包名下所有类 Set<Class<?>> classes = getClasses("com"); for(Class c:classes){ // 打印有RestController 的类 if(c.isAnnotationPresent(RestController.class)){ System.out.prin

  • Java中map内部存储方式解析

    Map,即映射,也称为 键值对,有一个 Key, 一个 Value . 比如 Groovy 语言中,  def  map = ['name' : 'liudehua', 'age' : 50 ] ,则 map[ 'name' ]  的值是 'liudehua'. 那么 Map 内部存储是怎么实现的呢?   下面慢慢讲解. 一. 使用 拉链式存储 这个以 Java 中的 HashMap 为例进行讲解.   HashMap 的内部有个数组 Entry[]  table, 这个数组就是存放数据的. E

  • Java如何通过反射获取Constructor、Field、Method对象

    目录 前言 使用反射技术获取构造器对象并使用 使用反射技术获取成员变量对象并使用 使用反射技术获取方法对象并使用 总结 前言 在实际开发中,通过反射可以得到一个类的完整结构,包括类的构造方法.类的属性.类的方法,这就需要使用到java.lang.reflect包中的以下几个类: 1.Constructor:表示类中的构造方法 2.Field:表示类中的属性 3.Method:表示类中的方法 使用反射技术获取构造器对象并使用 实验类: public class 反射机制_2实验类 { privat

  • Java如何通过反射获取私有构造、私有对象、私有字段、私有方法

    Java反射获取私有构造.私有对象.私有字段.私有方法 1. 创建测试的私有对象 /** * @author lirong * @desc 测试对象 * @date 2019/06/20 20:07 */ public class Person { private int age = 5; private String name; private Person(){} private String test(String name){ System.out.println("name: &quo

随机推荐