Java语言的反射机制

1. Java反射的含义:获取应用中正在运行的Java对象。

2. Java反射机制: 在运行的程序中,对于任意的类,都可以知道这个类的属性、方法以及构造函数,对于任意对象都可以调用它的方法。这种在运行时动态获取和修改类的信息的能力称为Java反射机制。

3. Java反射的功能:

  1) 在运行时判断任意一个对象所属的类

  2) 在运行时创建任意一个类的对象

  3) 在运行时获取任意一个类的所有成员变量、方法以及构造函数

  4) 在运行时调用任意一个对象的方法

  5) 作为动态代理的基础,生成代理类

4. Java反射的实现类

  1) Class : Class类表示Java应用运行时的类或接口

  2) Field : 提供有关类或接口的属性信息的对象

  3) Method : 提供有关类或接口方法信息的对象

  4) Constructor : 提供有关类构造函数的信息

  注意:Class类是Java反射中最重要的一个功能类,所有获取对象的信息(包括:方法/ 属性/构造方法/访问权限)都需要它来实现。

5. 编写Java反射程序的步骤:

  1) 首先获取一个类或对象的Class对象,方法如下:

    Class clazz1 = ClassName.class;

    Class clazz2 = Class.forName("com.znker.reflection.ClassName");

    Class clazz3 = Object.getClass();

  2) 调用Class对象中的方法来获取一个类的的属性、方法以及构造函数的对象

6. Java反射的使用案例

  1) 获取一个对象的包名和类名

  

package com.znker.reflection;

public class ReflectionDemo {
    // other codes
}

/**
 * Java 反射案例:获取一个对象的完整包名和类名
 *
 */
public class ReflectionTest {
    public static void main(String[] args) {
        ReflectionDemo demo = new ReflectionDemo();
        System.out.println(demo.getClass().getName());
    }
}

  2) 实例化Class对象

  

package com.znker.reflection;

/**
 * 三种实例化Class对象的方式
 *
 * */
public class ReflectionTest {
    @SuppressWarnings({ "unused", "rawtypes" })
    public static void main(String[] args) {
        // 最常用的形式
        try {
            // @param 类的全路径名
            Class<?> clazz1 = Class.forName("com.znker.reflection.Reflection");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        Class clazz2 = ReflectionDemo.class;

        Class clazz3 = new ReflectionDemo().getClass();
    }
}

  3) 利用无参构造函数创建对象

  

package com.znker.reflection;

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "[" + this.name + " , " + this.age + "]";
    }
}

package com.znker.reflection;

public class Refdemo {
    public static void main(String[] args) {
        Class<?> demo = null;
        try {
            demo = Class.forName("com.znker.reflection.Person");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        Person person = null;
        try {
            // 通过无参构造函数实例化对象, 构造一个与Class有关的对象
            person = (Person) demo.newInstance();

        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }

        person.setName("John");
        person.setAge(18);

        System.out.println(person);
    }
}

Java Reflection的更多相关文章

  1. Java Reflection(getXXX和getDeclaredXXX)

    package com.sunchao.reflection; public class Person { private int age ; private String name; public ...

  2. java Reflection(反射)基础知识讲解

    原文链接:小ben马的java Reflection(反射)基础知识讲解 1.获取Class对象的方式 1.1)使用 "Class#forName" public static C ...

  3. Java Reflection 反射基础

    反射基础: package reflection; /** * Created by : Infaraway * DATE : 2017/3/2 * Time : 23:06 * Funtion : ...

  4. Some Link: Java Reflection

    http://docs.oracle.com/javase/tutorial/reflect/index.html https://bugs.openjdk.java.net/browse/JDK-4 ...

  5. java reflection总结

    一.java反射常用方法 获取Class的几种方式: Class class1 = String.class;// 该方法最为安全可靠,程序性能更高.         Class class2 = s ...

  6. Java Reflection - Getters and Setters

    原文链接:http://tutorials.jenkov.com/java-reflection/getters-setters.html 通过使用 Java 反射,我们能够在程序执行时观察 clas ...

  7. Java Reflection (JAVA反射) --转载

    对于软件开发人员来说,单元测试是一项必不可少的工作.它既可以验证程序的有效性,又可以在程序出现 BUG 的时候,帮助开发人员快速的定位问题所在.但是,在写单元测试的过程中,开发人员经常要访问类的一些非 ...

  8. Java Annotations, Java Reflection, and Java Test Runner

    www.vogella.com/tutorials/JavaAnnotations/article.html

  9. Java反射(Reflection)

    基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...

随机推荐

  1. 转——JAVA中calendar,date,string 的相互转换和详细用法

    package cn.outofmemory.codes.Date; import java.util.Calendar; import java.util.Date; public class Ca ...

  2. 【转】Java关键字final、static使用总结

    转自:http://lavasoft.blog.51cto.com/62575/18771/   Java关键字final.static使用总结   一.final        根据程序上下文环境, ...

  3. 会话状态已创建一个会话 ID,但由于响应已被应用程序刷新而无法保存它

    解决方法是新建 全局应用程序类 Global.asax 在 Session_Start 函数中 添加 string sessionId = Session.SessionID; protected v ...

  4. 关键字extern

    extern 可以置于  变量  或  函数  前,  以表明变量 或 函数 的定义在别的文件中,  下面代码用到的这些变量  或 函数是外来的,  不是本文件定义的, 提示链接器遇到此变量和函数时在 ...

  5. dll 劫持

    库: AheadLib 输入dll 处填你要劫持的dll 路径. 例如: C:\WINDOWS\system32\lpk.dll 来自为知笔记(Wiz)

  6. C# dev开发过程中的山炮问题汇总

    1. 后台注册控件,页面form提交,后台获取控件方法  Request.Form["name"]:

  7. Hive的安装

    Hive的安装   第一步:解压并安装:第二步:配置 1)root用户下,解压后,改名为hive,并将hive文件夹赋给hadoop用户 tar -zxvf hive-0.9.0.tar.gz -C ...

  8. 巧用vsprintf将浮点数等转化字符串

    直接上代码 #include <stdarg.h> ]; int vspf(char *fmt, ...) { va_list argptr; int cnt; va_start(argp ...

  9. PHPCMS V9 分页类的修改教程

    首先,打开 phpcms\libs\functions\global.func.php 这个文件,找到文件第622行的分页函数,复制一下,粘贴到默认分页函数的下面,重新命名后保存.(笔者在此命名为:p ...

  10. C# winform 动态调用WebService

    封装的通用方法: using System; using System.Collections.Generic; using System.Text; using System.Xml; using ...