Java反射机制:包括组成、结构和示例说明等内容

第1部分 Java 反射机制介绍

Java 反射机制。通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还原“类的全部的信息”。这里“类的部分已经的信息”,可以是“类名”或“类的对象”等信息。“类的全部信息”就是指“类的属性,方法,继承关系和Annotation注解”等内容。

举个简单的例子:假设对于类ReflectionTest.java,我们知道的唯一信息是它的类名是“com.skywang.Reflection”。这时,我们想要知道ReflectionTest.java的其它信息(比如它的构造函数,它的成员变量等等),要怎么办呢?
这就需要用到“反射”。通过反射,我们可以解析出ReflectionTest.java的完整信息,包括它的构造函数,成员变量,继承关系等等。

在了解了“java 反射机制”的概念之后,接下来思考一个问题:如何根据类的类名,来获取类的完整信息呢?

这个过程主要分为两步:
第1步:根据“类名”来获取对应类的Class对象。
第2步:通过Class对象的函数接口,来读取“类的构造函数,成员变量”等信息。
下面,我们根据示例来加深对这个概念的理解。示例如下(Demo1.java):

package com.skywang.test;

import java.lang.Class;

public class Demo1 {

    public static void main(String[] args) {

        try {
            // 根据“类名”获取 对应的Class对象
            Class<?> cls = Class.forName("com.skywang.test.Person");

            // 新建对象。newInstance()会调用类不带参数的构造函数
            Object obj = cls.newInstance();

            System.out.println("cls="+cls);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Person {
    public Person() {
        System.out.println("create Person");
    }
}

运行结果:
create Person
cls=class com.skywang.test.Person

说明:
(01) Person类的完整包名是"com.skywang.test.Person"。而 Class.forName("com.skywang.test.Person"); 这一句的作用是,就是根据Person的包名来获取Person的Class对象。
(02) 接着,我们调用Class对象的newInstance()方法,创建Person对象。

现在,我们知道了“java反射机制”的概念以及它的原理。有了这个总体思想之后,接下来,我们可以开始对反射进行深入研究了。

第2部分 Class 详细说明

1 获取Class对象的方法

我这里总结了4种常用的“获取Class对象”的方法:
方法1:Class.forName("类名字符串") (注意:类名字符串必须是全称,包名+类名)
方法2:类名.class
方法3:实例对象.getClass()
方法4:"类名字符串".getClass()

下面,我们通过示例演示这4种方法。示例如下(Demo2.java):

package com.skywang.test;

import java.lang.Class;

public class Demo2 {

    public static void main(String[] args) {

        try {
            // 方法1:Class.forName("类名字符串")  (注意:类名字符串必须是全称,包名+类名)
            //Class cls1 = Class.forName("com.skywang.test.Person");
            Class<?> cls1 = Class.forName("com.skywang.test.Person");
            //Class<Person> cls1 = Class.forName("com.skywang.test.Person");

            // 方法2:类名.class
            Class cls2 = Person.class; 

            // 方法3:实例对象.getClass()
            Person person = new Person();
            Class cls3 = person.getClass();

            // 方法4:"类名字符串".getClass()
            String str = "com.skywang.test.Person";
            Class cls4 = str.getClass();

            System.out.printf("cls1=%s, cls2=%s, cls3=%s, cls4=%s\n", cls1, cls2, cls3, cls4);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Person {
    public Person() {
        System.out.println("create Person");
    }
}

运行结果:

create Person
cls1=class com.skywang.test.Person, cls2=class com.skywang.test.Person, cls3=class com.skywang.test.Person, cls4=class java.lang.String

2 Class的API说明

Class的全部API如下表:

Class的全部API如下表:
public static Class    forName(String className)
public static Class    forName(String name, boolean initialize, ClassLoader loader)
public Constructor    getConstructor(Class[] parameterTypes)
public Constructor[]    getConstructors()
public Constructor    getDeclaredConstructor(Class[] parameterTypes)
public Constructor[]    getDeclaredConstructors()
public Constructor    getEnclosingConstructor()
public Method    getMethod(String name, Class[] parameterTypes)
public Method[]    getMethods()
public Method    getDeclaredMethod(String name, Class[] parameterTypes)
public Method[]    getDeclaredMethods()
public Method    getEnclosingMethod()
public Field    getField(String name)
public Field[]    getFields()
public Field    getDeclaredField(String name)
public Field[]    getDeclaredFields()
public Type[]    getGenericInterfaces()
public Type    getGenericSuperclass()
public Annotation<A>    getAnnotation(Class annotationClass)
public Annotation[]    getAnnotations()
public Annotation[]    getDeclaredAnnotations()
public boolean    isAnnotation()
public boolean    isAnnotationPresent(Class annotationClass)
public boolean    isAnonymousClass()
public boolean    isArray()
public boolean    isAssignableFrom(Class cls)
public boolean    desiredAssertionStatus()
public Class<U>    asSubclass(Class clazz)
public Class    getSuperclass()
public Class    getComponentType()
public Class    getDeclaringClass()
public Class    getEnclosingClass()
public Class[]    getClasses()
public Class[]    getDeclaredClasses()
public Class[]    getInterfaces()
public boolean    isEnum()
public boolean    isInstance(Object obj)
public boolean    isInterface()
public boolean    isLocalClass()
public boolean    isMemberClass()
public boolean    isPrimitive()
public boolean    isSynthetic()
public String    getSimpleName()
public String    getName()
public String    getCanonicalName()
public String    toString()
public ClassLoader    getClassLoader()
public Package    getPackage()
public int    getModifiers()
public ProtectionDomain    getProtectionDomain()
public URL    getResource(String name)
public InputStream    getResourceAsStream(String name)
public Object    cast(Object obj)
public Object    newInstance()
public Object[]    getSigners()
public Object[]    getEnumConstants()
public TypeVariable[]    getTypeParameters()

我们根据类的特性,将Class中的类分为4部分进行说明:构造函数,成员方法,成员变量,类的其它信息(如注解、包名、类名、继承关系等等)。Class中涉及到Annotation(注解)的相关API,可以点击查看前一章节关于Annotation的详细介绍。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, 反射机制
, class
, boolean
, system.out.printf()
, 类名
, public
, classes
, person
, java getclass
, public volistthinkphp
, 反射类的main方法
, 反射 注解
#class
,以便于您获取更多的相关知识。

时间: 2024-10-18 06:31:35

Java反射机制:包括组成、结构和示例说明等内容的相关文章

Java 反射机制(包括组成、结构、示例说明等内容)

第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据"类的部分已经的信息"来还原"类的全部的信息".这里"类的部分已经的信息",可以是"类名"或"类的对象"等信息."类的全部信息"就是指"类的属性,方法,继承关系和Annotation注解"等内容. 举个简单的例子:假设对于类ReflectionTest.java,我们知道的

java反射机制示例_java

java反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 复制代码 代码如下: package C_20130313; import java.lang.reflect.Method; class User {     private String name;     public User(){}     public User(

JAVA反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. JAVA反射(放射)机制:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可

Java反射机制的学习

Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法). 也许你使用Java已经很长时间了,可是几乎不会用到Java反射机制.你会嗤之以鼻地告诉我,Java反射机制没啥用.或许在J2EE.J2SE等平台,Java反射机制没啥用(具体我也不了解,不多做评论),但是在Android应用开发中,该

使用Java反射机制确定基本数据类型属性

Java反射机制提供了一种强大的应用程序接口来帮助我们在运行时检测和执行对象上的操作.该机制允许程序员审视一个未知对象,并且获得它的属性,例如对象上的方法,JavaBean的属性以及继承关系等. Java中有两种类型的值,一种是类类型,它把对象的属性定义在一个类中.类类型是面向对象结构的基本组成部分.第二种类型的值是基本数据类型.反射类型通常用于类类型,但是,其实它也可以很方便应用到Java的基本类型上. Java中的基本类型继承自基于C的语法,其中包括boolean.byte.short.in

JAVA反射机制实例教程_java

本文以实例形式详细讲述了Java的反射机制,是Java程序设计中重要的技巧.分享给大家供大家参考.具体分析如下: 首先,Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性.例如,使用它能获得 Java 类中各成员的名称并显示出来. Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性.例如,Pascal.C 或者 C++ 中就没有办法在程序中获得函数

java反射机制 getreturntype是如何知道方法返回值类型的

问题描述 java反射机制 getreturntype是如何知道方法返回值类型的 各位大神,小弟有一事不明 我们有一个变量,就是方法名 java反射机制 getReturnType()是如何知道我要定义的这个方法的返回值类型. 它怎么知道我要的这个方法应该返回什么值?? 解决方案 java编译后的.class文件里面记录了类的全部信息,包括方法的返回值.参数.异常等.程序运行时,.class文件会被加载到运行时数据区,java反射 机制就是从类型信息中获取装载类解析后的详细信息的. 解决方案二:

java反射机制剖析(一)—简介

    由之前动态代理的学习再次接触到反射这个知识点,第二次接触了所以做了一些稍微深入的了解.那么,对于反射这部分的内容我打算分三篇博客来总结.本篇博客先对反射做一个大概的了解,包括反射有关的RTTI.定义的理解以及涉及到的其他知识的简介. 回顾     java之前我接触反射这个知识,是在大话设计中的抽象工厂模式里,通过反射+配置文件来优化抽象工厂提高其应对需求变更的灵活性.当时对于反射的认知仅仅是它是一种技术,一种实例化对象的技术,一种实例化对象不依赖于写死的代码的技术.简单的说就是,它是一

Java反射机制剖析:定义和API

1.什么是Java反射机制 Java的反射机制是在程序运行时,能够完全知道任何一个类,及其它的属性和方法,并且能够任意调用一个对象的属性和方法.这种运行时的动态获取就是Java的反射机制.其实这也是Java是动态语言的一个象征. 用一句话来概括反射就是加载一个运行时才知道的类以及它的完整内部结构. 2.为什么要有Java反射机制 我们为什么要用Java的反射机制呢? 我认为有两种: 第一种:反射的目的就是为了扩展未知的应用.比如你写了一个程序,这个程序定义了一些接口,只要实现了这些接口的dll都