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. web开发过程中经常用到的一些公共方法及操作

    进化成为程序猿也有段岁月了,所谓的经验,广度还是依旧,只不过是对于某种功能有了多种实现方式的想法.每天依旧不厌其烦的敲打着代码,每一行代码的回车似乎都有一种似曾相识的感觉.于是乎:粘贴复制,再粘贴再复 ...

  2. 如何判断js中的数据类型

    如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...

  3. WEB文件上传漏洞介绍解决办法

    引用:http://blog.csdn.net/kobejayandy/article/details/35861499 问题: -1. 上传文件WEB脚本语言,服务器的WEB容器解释并执行了用户上传 ...

  4. Linux常用性能调优工具索引

    root@ubuntu:~# dstat----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--usr sys i ...

  5. java网络流传输,中文乱码问题。

    最近需要从某个网页上抓取数据.一波三折. 1. 先要找到网站页面调用后台数据服务的url地址,但是本人对js不了解,花了不少时间在分析其网页源代码的js部分,试图寻找出调用数据的链接. 后来得知浏览器 ...

  6. 后台js弹提示

    StringBuffer sb=new StringBuffer(); try{ sb.append("<script> location.href=\"member_ ...

  7. Elasticsearch常用配置及性能参数

    cluster.name: estest   集群名称node.name: “testanya”  节点名称 node.master: false  是否主节点node.data: true   是否 ...

  8. C# 一些知识点总结(一)_继承,多态,集合,关键字...

    内存中的三大存储区域:栈.堆.静态存储区域 new 关键字:new帮助我们做了三件事:1)在内存中开辟一块空间(开辟内存空间)2) 在开辟的空间中创建对象3)调用对象的构造函数进行初始化对象所以构造函 ...

  9. SQL Server 临时表的删除

    --临时表与一般的表不同,它是保存到tempDb表中.临时表的表名与你所建的表名也不一样,因为他要为不同人的相同操作创建不同的临时表. --1.错误的删除操作: --错误的临时表删除操作,因为所在数据 ...

  10. 【Java布局】FlowLayout布局时设定组件大小

    默认的JPanel中,采用的是FlowLayout布局 下面是api中的定义: JPanel(boolean isDoubleBuffered)           创建具有 FlowLayout 和 ...