前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过反射创建对象大概有几种方式

通过反射创建对象大概有几种方式

原创
作者头像
艳艳代码杂货店
修改2021-09-26 09:38:45
9610
修改2021-09-26 09:38:45
举报
文章被收录于专栏:艳艳代码杂货店

常用方法摘要

返回值

方法说明

<U> Class<? extends U>

asSubclass(Class<U> clazz)强制转换该 Class 对象,以表示指定的 class 对象所表示的类的一个子类。

static Class<?>

forName(String className)返回与带有给定字符串名的类或接口相关联的 Class 对象。

<A extends Annotation>A

getAnnotation(Class<A> annotationClass)如果存在该元素的指定类型的注解,则返回这些注解,否则返回 null。

Annotation[]

getAnnotations()返回此元素上存在的所有注解。

ClassLoader

getClassLoader()返回该类的类加载器。

Class<?>

getComponentType()返回表示数组组件类型的 Class。

Annotation[]

getDeclaredAnnotations() 返回直接存在于此元素上的所有注解。

Class<?>

getDeclaringClass()如果此 Class 对象所表示的类或接口是另一个类的成员,则返回的 Class 对象表示该对象的声明类。

T[]

getEnumConstants()如果此 Class 对象不表示枚举类型,则返回枚举类的元素或 null。

Type[]

getGenericInterfaces()返回表示某些接口的 Type,这些接口由此对象所表示的类或接口直接实现。

Type

getGenericSuperclass()返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。

Class<?>[]

getInterfaces()确定此对象所表示的类或接口实现的接口。

int

getModifiers()返回此类或接口以整数编码的 Java 语言修饰符。

String

getName()以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。

String

getCanonicalName()返回 Java Language Specification 中所定义的底层类的规范化名称。主要用于输出(toString)或log打印,大多数情况下和getName()一样,但是在内部类、数组等类型的表示形式就不同了。不能用getCanonicalName()去加载类对象,必须用getName(),

Package

getPackage()获取此类的包。

InputStream

getResourceAsStream(String name)查找具有给定名称的资源。

String

getSimpleName()返回源代码中给出的底层类的简称。

Class<? super T>

getSuperclass()返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。

boolean

isAnnotation()如果此 Class 对象表示一个注解类型则返回 true。

boolean

isAnnotationPresent(Class<? extends Annotation> annotationClass)如果指定类型的注解存在于此元素上,则返回 true,否则返回 false。

boolean

isAnonymousClass()当且仅当底层类是匿名类时返回 true。

boolean

isArray()判定此 Class 对象是否表示一个数组类。

boolean

isAssignableFrom(Class<?> cls)判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口。

boolean

isEnum()当且仅当该类声明为源代码中的枚举时返回 true。

boolean

isInstance(Object obj)如果obj是这个类的一个实例此方法返回true。

boolean

isInterface()判定指定的 Class 对象是否表示一个接口类型。

boolean

isLocalClass()当且仅当这个类是局部类此方法返回true。

boolean

isMemberClass()当且仅当底层类是成员类时返回 true。

boolean

isPrimitive()判定指定的 Class 对象是否表示一个基本类型。

T

newInstance()创建此 Class 对象所表示的类的一个新实例。

new Instance

想通过反射创建对象大概有以下几种方式:

  1. 通过Class.newInstance()直接创建对象。
  2. 通过Class实例获取到Constructor(构造器),通过构造器创建对象。

获取构造方法的途径有以下几种:

返回值

方法说明

Constructor

getConstructor(Class<?>... parameterTypes)返回一个 Constructor 对象,它反映此 Class 对象所表示的类的public构造方法。

Constructor<?>[]

getConstructors()返回所有 Constructor 对象,它反映此 Class 对象所表示的类的public构造方法。

Constructor

getDeclaredConstructor(Class<?>... parameterTypes)返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类的public/private构造方法。

Constructor<?>[]

getDeclaredConstructor()返回所有 Constructor 对象,该对象反映此 Class 对象所表示的类的public/private构造方法。

示例代码如下:

代码语言:javascript
复制
@Getter
@Setter
@ToString
public class User {
   private String name;
   private Integer age;
   public User() {
      this.name = "张三";
      this.age = 24;
   }
   public boolean isAdmin(String name) {
      if("admin".equals(name)) {
         return true;
      }
      return false;
   }
}
代码语言:javascript
复制
@Slf4j
public class Test {
   public static void main(String[] args) throws Exception {
      Class<User> userClass = User.class;
      User user = userClass.newInstance();
      Constructor<User> constructor = userClass.getConstructor();
      User user1 = constructor.newInstance();
      Constructor<User> declaredConstructor = userClass.getDeclaredConstructor();
      // 如果构造器为private,则可以设置访问权限为true,即可newInstance
      declaredConstructor.setAccessible(true);
      User user2 = declaredConstructor.newInstance();

      log.info(user.toString());
      log.info(user1.toString());
      log.info(user2.toString());
   }
}

输出内容如下:

代码语言:javascript
复制
15:59:01.653 [main] INFO com.ldx.test.Test - User(name=张三, age=24)
15:59:01.663 [main] INFO com.ldx.test.Test - User(name=张三, age=24)
15:59:01.663 [main] INFO com.ldx.test.Test - User(name=张三, age=24)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 常用方法摘要
  • new Instance
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档