java反射机制详解

java反射机制详解,第1张

反射就是把Java的各种成分映射成相应的Java类。

Class类的构造方法是private,由JVM创建。

反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行 *** 作。例如它允许一个java的类获取他所有的成员变量和方法并且显示出来。Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。(来自Sun)

JavaBean 是 reflection 的实际应用之一,它能让一些工具可视化的 *** 作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。

反射是从12就有的,后面的三大框架都会用到反射机制,涉及到类"Class",无法直接new CLass(),其对象是内存里的一份字节码

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。

基本的 Java类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。Class 没有公共构造方法。

Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

Person p1 = new Person();

//下面的这三种方式都可以得到字节码

CLass c1 = Dateclass();

p1getClass();

//若存在则加载,否则新建,往往使用第三种,类的名字在写源程序时不需要知道,到运行时再传递过来

ClassforName("javalangString");

ClassforName()字节码已经加载到java虚拟机中,去得到字节码;java虚拟机中还没有生成字节码 用类加载器进行加载,加载的字节码缓冲到虚拟机中。 

另外,大家可以关注微信公众号Java技术栈回复:JVM,获取我整理的系列JVM教程,都是干货。

考虑下面这个简单的例子,让我们看看 reflection 是如何工作的。

import javalangreflect;

public class DumpMethods {

public static void main(String args[]) {

try {

Class c = ClassforName("javautilStack");

Method m[] = cgetDeclaredMethods();

for (int i = 0; i < mlength; i++)

Systemoutprintln(m[i]toString());

}

catch (Throwable e){

Systemerrprintln(e);

}

}

}

public synchronized javalangObject javautilStackpop()

public javalangObject javautilStackpush(javalangObject)

public boolean javautilStackempty()

public synchronized javalangObject javautilStackpeek()

public synchronized int javautilStacksearch(javalangObject)

这样就列出了javautilStack 类的各方法名以及它们的限制符和返回类型。这个程序使用 ClassforName 载入指定的类,然后调用 getDeclaredMethods 来获取这个类中定义了的方法列表。javalangreflectMethods 是用来描述某个类中单个方法的一个类。

以下示例使用 Class 对象来显示对象的类名:

void printClassName(Object obj) {

Systemoutprintln("The class of " + obj +

" is " + objgetClass()getName());

}

还可以使用一个类字面值(JLS Section 1582)来获取指定类型(或 void)的 Class 对象。例如:

Systemoutprintln("The name of class Foo is: "+FooclassgetName());

在没有对象实例的时候,主要有两种办法。

//获得类类型的两种方式

Class cls1 = Roleclass;

Class cls2 = ClassforName("yuiRole");

注意第二种方式中,forName中的参数一定是完整的类名(包名+类名),并且这个方法需要捕获异常。现在得到cls1就可以创建一个Role类的实例了,利用Class的newInstance方法相当于调用类的默认的构造器。

Object o = cls1newInstance();

//创建一个实例

//Object o1 = new Role(); //与上面的方法等价

这时的Object arr 就是相当于String[][] arr = new String[5][10];

多维数据就是数组的数组里面的每一个元素是一个长度为10的字符串数据

注释只是一个人为了以后好维护写的从代码来看就是说arr的第四个元素

set6相当于arr[4][6]="刘顿";

其实你的理解都是对的在学习的过程中大胆的去猜没有关系的这样会有第一版的理解每个人都不可能说对所有问题的理解都是对的往往在以后会发现有的理解错了这时校正错误的理解也是一种进步

祝学习愉快!

public class Bean {

private int id;

private String[] love;

public String[] getLove() {

return love;

}

public void setLove(String[] love) {

thislove = love;

}

public int getId() {

return id;

}

public void setId(int id) {

thisid = id;

}

}

public class Admin {

public static void main(String[] args) {

Field[] f = BeanclassgetDeclaredFields();

for (int i = 0; i < flength; i++) {

if (f[i]getType()isArray()) {

Systemoutprintln(f[i]getType());

}

}

}

}

以上就是关于java反射机制详解全部的内容,包括:java反射机制详解、JAVA 反射创建多维数组、java反射:getDeclaredFields() 获取所有的字段,遍历的时候怎么判断是不是数组类型的呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9476876.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存