详解Java反射创建对象
作者:星夜孤帆 发布时间:2022-12-10 03:52:23
标签:Java,反射,创建对象
一、什么是反射
Java Reflaction in Action中的解释:反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变。通俗的讲就是反射可以在运行时根据指定的类名获得类的信息 个人理解:就是我们对于创建对象我们除了通过 new关键字创建外,还能通过什么创建呢?private的属属性真的不能获取吗?反射就能做到打破这些所谓的规则反射和new创建对象谁的效率高? new
二、通过类对象调用newInstance()方法,适用于无参构造方法
2.1 类名.class
public class Main {
public static void main(String[] args) throws IllegalAccessException, InstantiationException {
Class<Person> clazz = Person.class;
Person person = clazz.newInstance();
System.out.println(person instanceof Person); // true
}
}
class Person {
private Integer age;
private String name;
public Person() {
}
}
2.2 Class.forName
public class Main {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
Class<?> clazz = Class.forName("com.best.test.Person");
Person person = (Person) clazz.newInstance();
System.out.println(person instanceof Person); // true
}
}
class Person {
private Integer age;
private String name;
public Person() {
}
}
2.3 对象名.getClass
public class Main {
public static void main(String[] args) throws IllegalAccessException, InstantiationException{
Person person = new Person();
Class<? extends Person> clazz = person.getClass();
Person person1 = clazz.newInstance();
System.out.println(person1 instanceof Person); // true
}
}
class Person {
private Integer age;
private String name;
public Person() {
}
}
三、getConstructor()和getDeclaredConstructor()
通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,适用于无参和有参构造方法。
3.1 getConstructor()
public class Main {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
Class<Person> clazz = Person.class;
Constructor<Person> ctor = clazz.getConstructor(Integer.class, String.class);
Person person = ctor.newInstance(26, "jak");
System.out.println(person instanceof Person); // true
}
}
class Person {
private Integer age;
private String name;
public Person(Integer age, String name) {
this.age = age;
this.name = name;
}
}
3.2 getDeclaredConstructor()
public class Main {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
Class<Person> clazz = Person.class;
Constructor<Person> ctor = clazz.getDeclaredConstructor(String.class);
Person person = ctor.newInstance("jak");
System.out.println(person instanceof Person); // true
}
}
class Person {
private Integer age;
private String name;
public Person(Integer age, String name) {
this.age = age;
this.name = name;
}
public Person(String name) {
this.name = name;
}
}
3.3 getConstructor()和getDeclaredConstructor()区别
getDeclaredConstructor(Class<?>... parameterTypes)
这个方法会返回指定参数类型的所有构造器,包括public的和非public的,当然也包括private的。getDeclaredConstructors()的返回结果就没有参数类型的过滤了。
再来看getConstructor(Class<?>... parameterTypes)
这个方法返回的是上面那个方法返回结果的子集,只返回指定参数类型访问权限是public的构造器。getConstructors()的返回结果同样也没有参数类型的过滤。
参考文章
来源:https://blog.csdn.net/qq_38826019/article/details/117385168


猜你喜欢
- 一、栈(Stack)1、什么是栈?栈其实就是一种数据结构 - 先进后出(先入栈的数据后出来,最先入栈的数据会被压入栈底)什么是java虚拟机
- java7增强的try语句关闭资源传统的关闭资源方式import java.io.FileInputStream;import java.i
- Java中的我们可以利用split把字符串按照指定的分割符进行分割,然后返回字符串数组split 方法该方法的作用是:将一个字符串分割为子字
- Android中子线程和UI线程之间通信的详细解释 1.在多线程编程这块,我们经常要使用Handler,Thread和Runnable这三个
- 1. 接口是一种规范很好,你已经知道接口是一种规范了!下面这张图是我们生活中遇到的接口:电源插座接口。2. 为什么需要规范呢?因为
- 主要注意的是在资源引用的地方AlertDialog.Builder(this,R.style.dialogNoBg).create();这里
- Spring AOP底层原理代理模式一、什么是 AOPAOP 就是面向切面编程,是 OOP(面向对象编程)的延续。利用 AOP 可以对业务逻
- 在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样?动手做实验:interface A{ void
- 本文实例讲述了Spring和Hibernate的整合操作。分享给大家供大家参考,具体如下:一 web配置<?xml version=&
- 首先看下面这一段代码:interface a{ void b();}interface a1 extends a{
- 本文实例为大家分享了Android蒙版弹出框效果的具体代码,供大家参考,具体内容如下自定义package cn.lxsdb.yyd.app.
- 下面Demo中我使用了2种排序方式1.让Employee继承IComparable 接口,实现CompareTo方法排序2.定义一个方法使用
- 目录基本查询延迟查询属性类型筛选复合from子句多级排序分组联合查询-join合并-zip()分区(分页)并行linq取消长时间运行的并行l
- 1.饿汉模式饿汉模式也叫预加载模式,它是在类加载时直接创建并初始化单例对象,所以它并不存在线程安全的问题。它是依靠 ClassLoader
- Java画图 给图片底部添加文字标题需求给图片底部添加文字编号import java.awt.Color;import java.awt.F
- 准备工具:IDEAjdk1.8Navicat for MySQLPostman一、新建Project选择依赖:mybatis Web Mys
- 首先看一看什么是装箱和拆箱?简单的来说:装箱就是值类型转换为引用类型;拆箱就是引用类型转换为值类型。值类型,包括原类型(Sbyte、Byte
- 需求描述现在有这样一个需求:我有A、B两台服务器,其中A是一个视频处理服务器,B是一个数据存储服务器。此时有一个视频需要先在A服务器上进行一
- 前言本文主要给大家介绍了关于Android模仿美团顶部滑动菜单的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。先
- package tao.cs;import java.io.IOException;import org.ksoap2.SoapEnvelo