精华内容
下载资源
问答
  • 反射机制的定义:在运行状态(动态的),对于任意一个类,都能够得到这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意属性和方法。Class类是反射机制的起源,我们得到Class类对象有3种方法:第一种:...

    反射机制的定义:

    在运行状态时(动态的),对于任意一个类,都能够得到这个类的所有属性和方法。

    对于任意一个对象,都能够调用它的任意属性和方法。

    Class类是反射机制的起源,我们得到Class类对象有3种方法:

    第一种:通过类名获得

    Class> class = ClassName.class;

    第二种:通过类名全路径获得:

    Class> class = Class.forName("类名全路径");

    第三种:通过实例对象获得:

    Class> class = object.getClass();

    通过代码总结三种方法的区别:(明天补上)

    1 class Test{2 static{3 System.out.println("静态代码块儿static code block");4 }5 {6 System.out.println("动态代码块儿dynamic code block");7 }8 }

    1 public class ClassCreate {

    2 public static void main(String[] args){

    3 Class> test2=Test.class;

    4 System.out.println("test");

    5 }

    6 }

    展开全文
  • java中反射的三种方法

    2021-03-16 16:15:44
    java中反射的三种方法:1. 通过Object类的getClass方法来获取中定义有getClass方法:public final Class getClass()所有Java对象都具备这个方法,该方法用于返回调用该方法的对象的所属类关联的Class对象,例如:...

    java中反射的三种方法:

    1. 通过Object类的getClass方法来获取

    中定义有getClass方法:public final Class getClass()

    所有Java对象都具备这个方法,该方法用于返回调用该方法的对象的所属类关联的Class对象,例如:

    Date date1 = new Date();

    Date date2 = new Date();

    Class c1 = date1.getClass();

    Class c2 = date2.getClass();

    System.out.println(c1.getName());

    // java.util.Date

    System.out.println(c1 == c2);

    // true

    上面的代码中,调用Date对象date1的getClass方法将返回用于封装Date类信息的Class对象。

    这里调用了的getName方法:public String getName(),这个方法的含义很直观,即返回所封装的类的名称。

    需要注意的是,代码中的date1和date2的getClass方法返回了相同的Class对象(c1==c2的值为true)。这是因为,对于相同的类,JVM只会载入一次,而与该类对应的Class对象也只会存在一个,无论该类实例化了多少对象。

    另外,需要强调的是,当一个对象被其父类的引用或其实现的接口类型的引用所指向时,getClass方法返回的是与对象实际所属类关联的Class对象。例如:

    List list = new ArrayList();

    System.out.println(list.getClass().getName()); // java.util.ArrayList

    上面的代码中,语句list.getClass()方法返回的是list所指向对象实际所属类java.util.ArrayList对应的 Class对象而并未java.util.List所对应的Class对象。有些时候可以通过这个方法了解一个对象的运行时类型,例如:

    HashSet set = new HashSet();

    Iterator it = set.iterator();

    System.out.println(it.getClass().getName()); //java.util.HashMap$KeyIterator

    从代码可以看出,HashSet的iterator方法返回的是实现了Iterator接口的HashMap内部类(KeyIterator)对象。

    因为抽象类和接口不可能实例化对象,因此不能通过Object的getClass方法获得与抽象类和接口关联的Class对象。

    2. 使用.class的方式

    使用类名加“.class”的方式即会返回与该类对应的Class对象。例如:

    Class clazz = String.class;

    System.out.println(clazz.getName()); //

    这个方法可以直接获得与指定类关联的Class对象,而并不需要有该类的对象存在。

    3. 使用Class.forName方法

    Class有一个著名的static方法forName:public static Class forName(String className) throws ClassNotFoundException

    该方法可以根据字符串参数所指定的类名获取与该类关联的Class对象。如果该类还没有被装入,该方法会将该类装入JVM。

    该方法声明抛出ClassNotFoundException异常。顾名思义,当该方法无法获取需要装入的类时(例如,在当前类路径中不存在这个类),就会抛出这个异常。

    例如,如果当前类路径中存在Foo类:

    package org.whatisjava.reflect;

    public class Foo {

    public Foo() {

    System.out.println("Foo()");

    }

    static {

    System.out.println("Foo is initialized");

    }

    }

    运行下面的代码:

    Class clazz = Class.forName("org.whatisjava.reflect.Foo");

    控制台会有如下输出:

    Foo is initialized

    Class.forName("org.whatisjava.reflect.Foo")首先会将reflection.Foo类装入JVM,并返回与之关联的Class对象。JVM装入Foo类后对其进行初始化,调用了其static块中的代码。需要注意的是:forName方法的参数是类的完 整限定名(即包含包名)。

    区别于前面两种获取Class对象的方法:使用Class.forName方法所要获取的与之对应的Class对象的类可以通过字符串的方式给定。该方法通常用于在程序运行时根据类名动态的载入该类并获得与之对应的Class对象。

    通过上面的文章相信你对java的反射机制有了一定的认识,同时也对java中的用法有了比较清晰的理解,在我们实际工作的过程中,我们不断的运用java知识来解决实际生活中的问题的时候我们就能对有一个更深入的理解!

    二、代码示例

    1.ClassTest.java

    [java] view plaincopy

    /**

    * java中的使用

    */

    import.*;

    import java.lang.reflect.*;

    public class ClassTest1 {

    public ClassTest1(){

    }

    public static void main(String[] args) throws Exception{

    ClassTest1 test=new ClassTest1();

    ClassTest1 test1=test.getClass().newInstance();

    //test1=test;

    test.printMessage();

    test1.printMessage();

    System.out.println(test.hashCode());

    System.out.println(test1.hashCode());

    Method[] method=test1.getClass().getMethods();

    for(Method m :method){

    System.out.println(m.getDeclaringClass());

    System.out.println(m.getName());

    }

    }

    public void printMessage(){

    System.out.println("Created successful!");

    }

    }

    运行结果:

    [plain] view plaincopy

    Created successful!

    Created successful!

    14576877

    12677476

    class ClassTest1

    printMessage

    class ClassTest1

    main

    class

    wait

    class

    wait

    class java.lang.Object

    wait

    class java.lang.Object

    hashCode

    class java.lang.Object

    getClass

    class java.lang.Object

    equals

    class java.lang.Object

    toString

    class java.lang.Object

    notify

    class java.lang.Object

    notifyAll

    2.TestClass.java

    [java] view plaincopy

    /**

    *

    */

    public class TestClass {

    public static void main(String[] args)

    {

    try {

    // 测试Class.forName()

    Class testTypeForName = Class.forName("TestClassType");

    System.out.println("testForName---" + testTypeForName);

    // 测试类名.class

    Class testTypeClass = TestClassType.class;

    System.out.println("testTypeClass---" + testTypeClass);

    // 测试Object.getClass()

    TestClassType testGetClass = new TestClassType();

    System.out.println("testGetClass---" + testGetClass.getClass());

    } catch (ClassNotFoundException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    }

    class TestClassType {

    //

    public TestClassType() {

    System.out.println("-------");

    }

    // 静态的参数初始化

    static {

    System.out.println("---静态的参数初始化---");

    }

    // 非静态的参数初始化

    {

    System.out.println("----非静态的参数初始化---");

    }

    }

    运行结果:

    [plain] view plaincopy

    ---静态的参数初始化---

    testForName---class TestClassType

    testTypeClass---class TestClassType

    ----非静态的参数初始化---

    -------

    testGetClass---class TestClassType

    分析:根据结果可以发现,三种生成的Class对象一样的,并且三种生成Class对象只打印一次“静态的参数初始化”。

    作者:传智播客JavaEE培训学院

    展开全文
  • 我需要在常量上调用方法,但不能引入编译时间依赖性,并且枚举在运行并不总是可用(可选安装的一部分)。所以我想用反思。这很容易,但是我之前没有使用枚举的反射。枚举看起来像这样:public enum PropertyEnum {...

    我使用的常量是Class的枚举。我需要在常量上调用方法,但不能引入编译时间依赖性,并且枚举在运行时并不总是可用(可选安装的一部分)。所以我想用反思。

    这很容易,但是我之前没有使用枚举的反射。

    枚举看起来像这样:

    public enum PropertyEnum {

    SYSTEM_PROPERTY_ONE("property.one.name", "property.one.value"),

    SYSTEM_PROPERTY_TWO("property.two.name", "property.two.value");

    private String name;

    private String defaultValue;

    PropertyEnum(String name) {

    this.name = name;

    }

    PropertyEnum(String name, String value) {

    this.name = name;

    this.defaultValue = value;

    }

    public String getName() {

    return name;

    }

    public String getValue() {

    return System.getProperty(name);

    }

    public String getDefaultValue() {

    return defaultValue;

    }

    }什么是使用反射调用常量方法的示例?

    展开全文
  • Java反射定义、获取Class三种方法

    千次阅读 2021-02-13 01:31:52
    反射机制的定义:在运行状态(动态的),对于任意一个类,都能够得到这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意属性和方法。Class类是反射机制的起源,我们得到Class类对象有3种方法:第一种:...

    反射机制的定义:

    在运行状态时(动态的),对于任意一个类,都能够得到这个类的所有属性和方法。

    对于任意一个对象,都能够调用它的任意属性和方法。

    Class类是反射机制的起源,我们得到Class类对象有3种方法:

    第一种:通过类名获得

    Class> class = ClassName.class;

    第二种:通过类名全路径获得:

    Class> class = Class.forName("类名全路径");

    第三种:通过实例对象获得:

    Class> class = object.getClass();

    通过代码总结三种方法的区别:

    1 /**

    2 * Created by hunt on 2017/6/23.3 */

    4

    5 /**

    6 * 测试类7 */

    8 public classClassTest {9 static{10 System.out.println("静态代码块儿...");11 }12 {13 System.out.println("动态构造块儿...");14 }15 publicClassTest(){16 System.out.println("构造方法...");17 }18 }

    1 /**

    2 * Created by hunt on 2017/6/23.3 */

    4

    5 /**

    6 * 第一种方法获得Class对象7 */

    8 public classMainTest {9 public static voidmain(String[] args) {10 Class> calss = ClassTest.class;11 }12 }13

    14 /**

    15 * 打印结果是:16 * 什么都没打印17 * 说明ClassName.class不执行静态块和不执行动态块儿18 */

    1 /**

    2 * Created by hunt on 2017/6/23.3 */

    4

    5 /**

    6 * 第二种方法获得Class对象7 */

    8 public classMainTest {9 public static voidmain(String[] args) {10 try{11 Class> calss = Class.forName("com.souche.lease.admin.mytest.reflect.ClassTest");12 } catch(ClassNotFoundException e) {13 e.printStackTrace();14 }15 }16 }17

    18 /**

    19 * 打印结果是:20 * 静态代码块儿...21 * 说明Class.forName("类名全路径")执行静态块但是不执行动态块儿(需要异常处理)22 */

    1 /**

    2 * Created by hunt on 2017/6/23.3 */

    4

    5 /**

    6 * 第三种方法获得Class对象7 */

    8 public classMainTest {9 public static voidmain(String[] args) {10 Class> calss = newClassTest().getClass();11 }12 }13

    14 /**

    15 * 打印结果是:16 * 静态代码块儿...17 动态构造块儿...18 构造方法...19 * 说明对象.getClass()执行静态块也执行动态块儿20 */

    总结:第一种方法:类字面常量使得创建Class对象的引用时不会自动地初始化该对象,而是按照之前提到的加载,链接,初始化三个步骤,这三个步骤是个懒加载的过程,不使用的时候就不加载。

    第二种方法:Class类自带的方法。

    第三种方法:是所有的对象都能够使用的方法,因为getClass()方法是Object类的方法,所有的类都继承了Object,因此所有类的对象也都具有getClass()方法。

    建议:使用类名.class,这样做即简单又安全,因为在编译时就会受到检查,因此不需要置于try语句块中,并且它根除了对forName()方法的调用,所以也更高效。

    注意:静态块仅在类加载时执行一次,若类已加载便不再重复执行;而动态构造块在每次new对象时均会执行。

    展开全文
  • Java反射的概念和作用

    2021-04-06 10:22:56
    Java 的反射可以在运行加载,探知和使用编译期间完全未知的类。 对于一个已经加载的类,可以知道类的所有属性和方法。对于任意一个已经加载的对象,可以调用该对象的任意一个属性和方法。 在Java虚拟机中,加载完...
  • java反射技术

    2021-03-14 19:04:21
    反射的概述反射appDomain 的程序集反射单个程序集利用反射获取类型信息设置反射类型的成员通过反射创建类型的实例反射类型的接口反射的性能反射的概述反射定义:审查元数据并收集关于它的类型信息的能力。...
  • 注解和反射(之一:什么是注解和反射) 一、注解 注解入门 Annotation是从JDK5.0开始引入的新技术. Annotation的作用: 不是程序本身,可以对程序作出解释.(这一点和注释(comment)没什么区别) 可以被其他程序(比如...
  • 氧气氢气二氧甲烷化碳,定义电池的地燃料燃料极反应方为。都是动发电机气带燃烧后产发电生蒸,函数回值电池电相与...包括能热的聚太阳光集热子系统发电,踪装置光器、跟器B器D、聚接收反射。易于获得,定义便宜资...
  • Java反射

    2021-03-09 03:51:34
    Java中的反射反射:能够分析类所拥有的能力的程序称为反射反射的作用当我们在使用一个已有的类的时候,在主代码的main()方法中使用别的已有的类的时候,如果被使用的类发生了改变,那么导致我们的main()方法中也要...
  • 反射

    2021-05-21 22:35:48
    本文讲述的是反射是在计算机领域的概念,在计算机科学中,反射编程(reflective programming)定义如下,这是来做维基百科的描述。 In computer science, reflective programming or reflection is the ability of ...
  • [Java教程]Java反射定义、获取Class三种方法0 2017-06-23 00:00:25反射机制的定义:在运行状态(动态的),对于任意一个类,都能够得到这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意属性和方法。...
  • Java反射详细介绍

    2021-02-28 19:19:11
    反射概述1.1 反射概述1.2 获取class文件对象的三种方式1.3 反射常用的方法介绍1.4 反射定义1.5 反射的组成1.6 反射的作用有哪些2.反射的相关使用2.1.1 通过反射获取无参构造方法并使用2.1.2 通过反射获取带参构造...
  • java反射 概念

    2021-03-06 21:41:26
    一、什么是反射机制 简单的来说,反射机制指的是程序在运行能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。二、哪里用到反射机制 有些时候,我们用过一些知识,但是...
  • 比如Person类,虽然擦除掉了泛型,但是通过反射机制是可以获得这些信息的,不光如此,Person类里面定义的泛型方法都可以通过反射获得。让我们用代码来验证一下。在用代码验证之前,大象会对Person类稍微改造一下,...
  • 一、什么是反射:(1)Java反射机制的核心是在程序运行动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取t对象的各种信息。(2)Java...
  • 【Java反射

    多人点赞 2021-12-04 10:33:15
    我们来一句话定义反射反射就是把java类中的各种成分映射成一个个的Java对象 不理解这句话什么意思?没关系,在我百度了几分钟后,找到三种解释: 解释一:一个类有:成员变量、方法、构造方法、包等等信息,利用...
  • java注解 与 反射

    2021-03-09 09:20:55
    java注解 与 反射java(Annotation)注解,要通过反射(Reflection)才能发挥其强大的功能一:注解1:什么是注解(Annotation)?* 注解:说明程序的。给计算机看的* 注释:用文字描述程序的。给程序员看的* 定义:注解...
  • /**** @author YZJ* @Description java中定义常量的最佳方法*/public final class Contants{/*** @Description 私有化构造方法*/private Contants(){};public static final int contants1 = 1<<1;public ...
  • 注解使用在使用注解,在类名、方法名、域上直接用@+注解名即可。比如一个叫做MyAnnotation的注解:1.类注解在类A上添加@MyAnnotaion,即用MyAnnotation注解了类A。方法、域同理。@MyAnnotationp...
  • 本实例使用反射输出类的包、类的名字、类的公共构造方法、类的公共域和类的公共方法。在重写不同类的toString()方法调用该方法就可以避免多次重写toString()方法。实例运行效果如图 编写类StringUtils,在该类中...
  • JAVA反射与类加载机制

    2021-03-10 08:06:07
    JAVA反射动态语言动态语言:程序在运行可以改变结构,新的函数可以引进,已有的函数可以被删除等结构上的变化。从反射角度说JAVA属于半动态语言。反射机制java反射机制:在运行状态下,对任意一个类都能知道这个类...
  • 反射JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射...
  • Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.2. 参数成员只能用public或默认(default)这两个访问权修饰3. 参数成员只能用基本类型byte...
  • java反射

    2021-03-09 03:51:33
    反射定义java核心技术卷1中的定义:能够分析类能力的程序称为反射反射:将类的各个部分封装为其它对象,这就是反射机制。百度:反射就是根据给出的类名(字符串)来生成对象好处:1.在程序运行时期操纵对象。Idea...
  • Reflection(反射)是被视为动态语言的关键,通过反射机制,我们可以在运行(runtime)获取类的完整结构。例如,可以获取到类的变量名、方法、构造器、内部类、接口、注解等等,并且通过反射机制可以对类内部进行操作...
  • 创建一个实体类,User,定义成员变量,构造方法,成员方法等操作。 public class user{ private Integer id; private String name; private Integer age; private user(){} private user(Intege

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 249,758
精华内容 99,903
关键字:

反射时定义