通过程序化的方式间接对Class的对象实例操作,Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数、属性和方法等。
Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能,则就为使用程序化方法操作Class对象开辟了途径。
 
类装载器 ClassLoader
类装载器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件。在Java中,类装载器把一个类装入JVM中,经过的步骤如下:
1)装载:查找和导入Class文件;
2)链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的:
    a)校验:检查载入Class文件数据的正确性;
    b)准备:给类的静态变量分配存储空间;
    c)解析:将符号引用转成直接引用;
3)初始化:对类的静态变量、静态代码块执行初始化工作。
JVM在运行时会产生三个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器)。
package com.reflect;
/**
* Created by gao on 16-3-18.
*/
public class ClassLoaderTest {
public static void main(String[] args) {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
System.out.println("current loader:" + loader);
System.out.println("parent loader:" + loader.getParent());
System.out.println("grandparent loader:" + loader.getParent().getParent());
}
}

输出结果:

current loader:sun.misc.Launcher$AppClassLoader@6ba5d6d6
parent loader:sun.misc.Launcher$ExtClassLoader@54bbb2d0
grandparent loader:null
 
ClassLoader重要方法:
1)Class loaderClass(String name):name参数指定类装载器需要装载类的名字,必须使用全限类名。该方法有一个重载方法loadClass(String name, boolean resolve),resolve参数告诉类装载器是否需要解析该类。
2)Class defineClass(String name, byte[] b, int off, int len):将类文件的字节数组转换成JVM内部的java.lang.Class对象。
3)Class findSystemClass(String name):从本地文件系统载入Class文件。
4)Class findLoadedClass(String name):调用该方法来查看ClassLoader是否已装入某个类。
5)ClassLoader getParent():获取类装载器的父装载器。
 
Java反射机制:
Class反射对象描述类语义结构,可以从Class对象中获取构造函数、成员变量、方法类等类元素的反射对象,并以编程的方式通过这些反射对象对目标类对象进行操作。
1)Constructor:类的构造函数反射类,通过Class#getConstructors()方法可以获得类的所有构造函数反射数组。还可以通过getConstructor(Class...parameterTypes)获取拥有特定入参的构造函数对象。Constructor的一个主要方法是newinstance(Object[] initargs),通过该方法可以创建一个对象类的实例,相当于new关键字。
2)Method:类方法的反射类,通过Class#getDeclaredMethods()方法可以获取类的所有方法反射类对象数组Method[]。在JDK5中可以通过getDeclaredMethod(String name, Class...parameterTypes)获取特定签名的方法。Method最主要的方法是invoke(Object obj, Object[] args)。
    a)Class getReturnType():获取方法的入参类型数组;
    b)Class[] getParameterTypes():获取方法的入参类型数组;
    c)Class[] getExecptionTypes():获取方法的异常类型数组;
    d)Annotation[][] getParameterAnnotations():获取方法的注解信息
3)Field:类的成员变量的反射类,通过Class#getDeclaredFields()方法可以获取类的成员变量反射对象数组,通过Class#getDeclaredField(String name)则可获取某个特定名称的成员变量反射对象。Field类最主要的方法是set(Object obj,Object value)。
 
1、构建一个简单的Web项目:chapter03
 
 
2、创建类com.reflect.Car
package com.reflect;
/**
* Created by gao on 16-3-18.
*/
public class Car {
private String brand;
private String color;
private int maxSpeed;
public Car() {
}
public Car(String brand, String color, int maxSpeed) {
this.brand = brand;
this.color = color;
this.maxSpeed = maxSpeed;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
public void introduce() {
System.out.println("brand:" + brand + ";color:" + color + ";maxSpeed:" + maxSpeed);
}
protected void drive(){
System.out.println("dirve private car! the color is:"+color);
}
}

3、创建测试类com.reflect.ReflectTest

package com.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* Created by gao on 16-3-18.
*/
public class ReflectTest {
public static Car initByDefaultConst() throws Throwable{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.reflect.Car");
Constructor cons = clazz.getDeclaredConstructor((Class[]) null);
Car car = (Car)cons.newInstance();
Method setBrand = clazz.getMethod("setBrand",String.class);
setBrand.invoke(car,"奥迪");
Method setColor = clazz.getMethod("setColor",String.class);
setColor.invoke(car,"红色");
Method setMaxSpeed = clazz.getMethod("setMaxSpeed",int.class);
setMaxSpeed.invoke(car,300);
return car;
}
public static void main(String[] args) throws Throwable {
Car car = initByDefaultConst();
car.introduce();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.reflect.Car");
Car car1 = (Car)clazz.newInstance();
Field colorFld = clazz.getDeclaredField("color");
colorFld.setAccessible(true);
colorFld.set(car1, "白色");
Method dirveMtd = clazz.getDeclaredMethod("drive",(Class[])null);
dirveMtd.setAccessible(true);
dirveMtd.invoke(car1,(Object[])null);
}
}
结果输出:
brand:奥迪;color:红色;maxSpeed:300
dirve private car! the color is:白色
 
 
 
 
 
 
 

Java—反射的更多相关文章

  1. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  2. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  3. java反射(基础了解)

    package cn.itcast_01; /** *Person类 */ public class Person {    /** 姓名 */    private String name;     ...

  4. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  5. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  6. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

  7. java反射学习之一反射机制概述

    一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...

  8. java反射 之 反射基础

    一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...

  9. java反射 cglib asm相关资料

    有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...

  10. 超详细的java反射教程

    看技术博客时,看到关于java反射的博文,写的非常好.猛击下面的地址,开始java反射之旅 中文翻译地址:http://ifeve.com/java-reflection/ 英文原版地址:http:/ ...

随机推荐

  1. Nginx模块开发-理解HTTP配置

    理解HTTP配置 相关数据结构 先明白Nginx下述数据结构,再理解 HTTP配置的解析与合并过程 ngx_module_t 官方API typedef struct{ NGX_MODULE_V1; ...

  2. 【go】sdk + idea-plugin 开发工具安装

    http://golang.org/doc/install/source 第一步:windows 安装 git第二步$ git clone https://go.googlesource.com/go ...

  3. iOS开发应用学习笔记

    一.iOS应用设计 1. 参考资料: 解读iPhone平台的一些优秀设计思路 iPhone App的特点及基本设计方法 Mobile UI design and Developer 2. 用户对iPh ...

  4. define的用法

    define的用法小结 define的用法只是一种纯粹的替换功能,宏定义的替换是预处理器处理的替换. 一:简单的宏定义用法 格式:#define 标识符 替换内容 替换的内容可以是数字,字符,字符串, ...

  5. VB数据库经典实例总结(一)

    先让大家看一张图.随后讲解..... 敲完五个例子之后的心情是非常好的.并没有想象中的那么难,深究它的话大致思路就是.: 建立数据库 --->利用VB导出数据 --->供人们使用.. 因为 ...

  6. C++中的虚函数(类的向上转换,和向下转换)

    1.C++中的封装时为了代码的模块化,继承是为了代码的重用,而多态则是为了接口的重用. 2.C++中的多态是用虚函数来实现的. 3.子类对象向父类指针的转换(向上转换)是安全的,隐式的,而父类对象向子 ...

  7. 团队项目之Sprint计划会议

    一.我们团队在4月15日进行了冲刺计划会议,会议过程大致如下: 1.总结目前的工作进展,再一次确定所做项目的方向: 2.将之前的调查问卷的结果进行统计,做了需求分析,大致了解了用户的想法: 3.根据初 ...

  8. iOS VideoToolbox硬编H.265(HEVC)H.264(AVC):2 H264数据写入文件

    本文档为iOS VideoToolbox硬编H.265(HEVC)H.264(AVC):1 概述续篇,主要描述: CMSampleBufferRef读取实际数据 序列参数集(Sequence Para ...

  9. 简单易用的导出文件(Excel、word等各种格式)的方法

    以前学习过NPOI导出数据到Excel中,代码较长,不易记忆.工作中,看到了其他同事写的代码,研究了一下,贴出来,共同学习. 使用这种方式,不仅可以设置表格的样式,而且代码简洁. 首先,在后台中通过S ...

  10. [转载]eclipse中设置文件的编码格式为utf-8

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:ryxxlong     原文地址:http://ryxxlong.iteye ...