Java反射基础(一)

构造方法的获取

  1. 四个方法:getConstructors()获取所有的构造方法;

getConstructor(parameters)获取匹配参数的构造方法;

getDeclaredConstructors()仅获取类中所有真正的构造方法,不包括从父类继承的构造方法;

getDeclaredConstructor(parameters)仅获取类中匹配参数的所有真正的构造方法,不包括从父类继承的构造方法。

  2. 对于构造方法中参数为可变参数的情况,当调用getDeclaredConstructor(parameters)时,parameters应该是数组类型的Class对象,

例如 String[].class

3. 关于嵌套类的构造方法的调用

需要区分静态和非静态嵌套类两种情况,静态情况下,和一般的调用方法一样,非静态情况下则比较特殊。

(1)静态嵌套类

 1 package jichu;
 2
 3 import java.lang.reflect.Constructor;
 4
 5 /**
 6  *@author 作者  Yu chenchen
 7  *@version 创建时间:2017年4月28日 上午11:05:33
 8  *类说明:
 9  */
10 public class TestReflection {
11
12     public TestReflection(){
13
14     }
15     public TestReflection(String str) {
16         // TODO Auto-generated constructor stub
17     }
18
19     //静态嵌套类
20     static class NestedClass{
21          public NestedClass(int i) {
22             // TODO Auto-generated constructor stub
23         }
24     }
25
26     public void test() throws Exception{
27         Constructor<TestReflection> constructor = TestReflection.class.getDeclaredConstructor(String.class);
28         constructor.newInstance("ycc");
29         //获取静态嵌套类的构造方法
30         Constructor<NestedClass> constructor2 = NestedClass.class.getConstructor(int.class);
31         constructor2.newInstance(11);
32
33     }
34     public static void main(String[] args) {
35         try {
36             new TestReflection().test();
37         } catch (Exception e) {
38             // TODO Auto-generated catch block
39             e.printStackTrace();
40         }
41
42     }
43
44 }

(2)非静态嵌套类

对于非静态嵌套类来说,它的对象实例中有一个隐含的指向外部类对象的引用,靠这个引用可以访问外部类对象的私有域和方法,因此在获取非静态嵌套类的构造方法时,类型参数列表的第一个参数必须为外部类的Class对象。在获取到构造方法之后,调用newInstance()方法时,第一个参数应该为外部类对象的引用this,与调用getDeclaredConstructor()方法的第一个参数对应。

 1 package jichu;
 2
 3 import java.lang.reflect.Constructor;
 4
 5 /**
 6  *@author 作者  Yu chenchen
 7  *@version 创建时间:2017年4月28日 上午11:05:33
 8  *类说明:
 9  */
10 public class TestReflection {
11
12     public TestReflection(){
13
14     }
15     public TestReflection(String str) {
16         // TODO Auto-generated constructor stub
17     }
18
19     //非静态嵌套类
20     class NestedClass{
21          public NestedClass(int i) {
22             // TODO Auto-generated constructor stub
23         }
24     }
25
26     public void test() throws Exception{
27         Constructor<TestReflection> constructor = TestReflection.class.getDeclaredConstructor(String.class);
28         constructor.newInstance("ycc");
29         //获取非静态嵌套类的构造方法
30         Constructor<NestedClass> constructor2 = NestedClass.class.getConstructor(TestReflection.class,int.class);
31         constructor2.newInstance(this,11);
32         //或者
33         constructor2.newInstance(TestReflection.this,11);
34
35     }
36     public static void main(String[] args) {
37         try {
38             new TestReflection().test();
39         } catch (Exception e) {
40             // TODO Auto-generated catch block
41             e.printStackTrace();
42         }
43
44     }
45
46 }
时间: 2024-10-27 13:53:18

Java反射基础(一)的相关文章

Java反射基础笔记

由于工作中发现自己的基础知识掌握的并不是很牢固,遇到的问题与学习的东西也没有很好的做过记录,导致再遇到时耗费大量时间上网搜索,所以决定串下基础知识并尽量形成记录,方便自己之后遗忘时查询,也方便各位有需求的伙伴翻阅查看,大家共同探讨.学习. 本次梳理的是Java反射的基础,该系列为笔者学习慕课反射讲解视频的学习笔记,尽可能全的记录,以帮助初学者快速掌握反射基础知识,如需转载该系列请注明原文链接. 一.反射之Class类的使用 二.反射之获取方法信息 更多编辑中 --

java反射基础知识(一)

一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 要想解剖一个类,必须先要获取到该类的字节码文件对象.而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.对于反射的操作实际上就是通过Class对象获取: *a.java.lang.reflect.Field:提供有关类或接口的单个

java反射基础知识(四)反射应用实践

反射基础 p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start. 在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类Class,在Java中我们有三种方法可以获取一个对象的反射类. 通过getClass方法 在Java中,每一个Object都有一个getClass()方法,通过getClass方法我们可以获取到这个对象对应的反射类: 1 2 String s = "ziwenxie"; Class

java反射基础知识(二)

1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以让我们在运行时获取类的函数.属性.父类.接口等 Class 内部信息的机制.通过反射还可以让我们在运行期实例化对象,调用方法,通过调用 get/set 方法获取变量的值,即使方法或属性是私有的的也可以通过反射的形式调用,这种"看透 class"的能力被称为内省,这种能力在框架开发中尤为重要. 有些情况下,我们要使用的类在运行时才会确定,这个时候我们不能在编译期就使用它,因此只能通过反射的形式来使用在运

java反射基础知识(五)反射应用实践

详解Java反射各种应用 Java除了给我们提供在编译期得到类的各种信息之外,还通过反射让我们可以在运行期间得到类的各种信息.通过反射获取类的信息,得到类的信息之后,就可以获取以下相关内容: Class对象 构造器 变量 方法 私有变量与私有方法 注解 泛型 数组 本文也将从上面几个方面来介绍Java反射.本文涉及的所有代码均在反射代码首先放出一个Java类作为反射的研究对象,类的内容如下: public abstract class FatherObject implements Runnab

java反射(基础了解)

package cn.itcast_01; /** *Person类 */ public class Person { /** 姓名 */    private String name; /** 年龄 */    private int age; /** 性别 */    private String sex; public Person(String name, int age, String sex) {        super();        this.name = name;  

Java反射基础(二)— Class类

上一篇博客中我们提到了ClassLoader,知道ClassLoader是用来动态加载某个Class文件到内存当中,但是这个Class文件是怎么生成的呢?从何而来?这又涉及到另一个概念-java.lang.Class. Class 是java的一个特殊类,对于我们定义的类.接口,它更算是一个抽象类.Class类用于封装被装入到JVM中的类(包括类和接口)的信息. 当一个类和接口被装入JVM时,就自动创建一个Class类的实例来表示这个类,也就是我们说的Class对象,收集了当前这个对象的基本信息

java反射基础

转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?opt=1最近在接触到框架的底层的时候,遇到了反射,便想好好的学习和总结一下反射,帮助理解java框架的运行流程和运行原理:根据万物皆对象,所以类也是对象,通过反射得到描述类的对象,也就是Class这个类.有三种方法得到:类名.class;实例.getclass;Class.forName(全类名);得到描述类的类后,就可以通过类里面的方法,字段和注解.在java编程中,使用的框架大多对底层进行了封装,在进

5、java反射基础

Class对象: Class对象记录了所有与类相关的信息,当类加载器从文件系统中加载.class文件到JVM中的同时会为每一个类创建一个Class对象.通过Class对象可以获取到类的属性.方法.构造器等全部与类相关的信息. 现在假设在com.aop包下有一个抽象类和一个类,定义如下: package com.aop; abstract public class Creature<T> { } 1 package com.aop; 2 3 public class Person extends

Java反射基础(二)

获取域   1. 通过反射API可以获取到类中公开的静态域和对象中的实例域.得到表示域的java.lang.reflect.Field类的对象之后,就可以获取和设置域的值. 与获取构造方法类似,Class类中有4个方法用来获取域: getFileds().getFiled(fieldName). getDeclaredFields().getDeclaredField(fieldName),其含义与获取构造方法的4个方法类似. 静态域和实例域的区别是:在使用静态域的时候,不需要提供具体对象实例,