java 中反射机制和内省机制的区别

java 中反射机制和内省机制的区别,第1张

1什么是反射

反射就是在运行状态把 Java 类中的各种成分映射成相应相应的 Java 类,可以动态得获取所有的属性以及动态调用任意一个方法。

1)一段java代码在程序的运行期间会经历三个阶段:source-->class-->runtime

2)Class对象

在java中用一个Class对象来表示一个java类的class阶段

Class对象封装了一个java类定义的成员变量、成员方法、构造方法、包名、类名等。

2反射怎么用

1)获得java类的各个组成部分,首先需要获得代表java类的Class对象

获得Class对象有以下三种方式:

Classforname(className) 用于做类加载

objgetClass() 用于获得对象的类型

类名class 用于获得指定的类型,传参用

2)反射类的构造方法,获得实例

Class clazz = 类名class;

Constuctor con = clazzgetConstructor(new Class[]{paramClazz1,paramClazz2,});

connewInstance(params);

3)反射类的成员方法

Method m = clazzgetMethod(methodName,new Class[]{paramClazz1,paramClazz2,});

minvoke();

4)反射类的属性

Field field = clazzgetField(fieldName);

fieldsetAccessible(true);//设置为可访问

filedsetObject(value); //设置值

Object value = fieldget(clazz); //获得值

Object staticValue = filedget(Class); //获得静态值

二:内省

1什么是内省

通过反射的方式 *** 作JavaBean的属性,jdk提供了PropertyDescription类来 *** 作访问JavaBean的属性,Beantils工具基于此来实现。

2内省怎么用

1) *** 作一个属性

Object obj = new Object();

PropertyDescriptor pd = new PropertyDescriptor(propertyName,Class); //声明属性描述对象,一次只可描述一个属性

Method m = pdgetWriterMethod();//获取setter方法

minvoke(obj,value);

Method m = pdgetReaderMethod();//获取getter方法

Object value = minvoke(obj);

2) *** 作多个属性

BeanInfo bi = InstospectorgetBeanInfo(beanClass);//获取Bean描述对象

PropertyDescriptor[] pds = bigetPropertyDescriptors();//获取属性描述对象数组

拿到属性描述对象数组之后再循环数组,剩余的 *** 作就跟" *** 作一个属性"相同了。

class获得的是类的class对象,可不是这个类的对象,用class

变量名接收,用这个class对象通过反射机制可以通过newinstence创建出这个类的对象而且只能调用无参数构造器

var obj = documentgetElementsByTagName("span");//先得到所有的SPAN标记

for(var i=0;i<objlength;i++)

{

if(obj[i]className == 'a')//找出span标记中class=a的那个标记

{

var getObj = obj[i];

value = getObjinnerHTML;//获得他的innerHTML

}

}//有效且管用,但是很笨的方法,目前我没发现还有其他方法。

Class类是javalang包下的类,针对你的提问, 举一个简单易懂的例子来理解一下:package comtest;public class Student { //声明私用属性

private int id;

private String username;

private String userpwd;

private int age;

//共有属性

public String str = "some strings"; //私用方法

private Student getStudent(){

return new Student();

}

//共有的setter和getter方法

public int getId() {

return id;

} public void setId(int id) {

thisid = id;

} public String getUsername() {

return username;

} public void setUsername(String username) {

thisusername = username;

} public String getUserpwd() {

return userpwd;

} public void setUserpwd(String userpwd) {

thisuserpwd = userpwd;

} public int getAge() {

return age;

} public void setAge(int age) {

thisage = age;

} public String getStr() {

return str;

} public void setStr(String str) {

thisstr = str;

}

}

------------------------------------------------------------------------------------ package comtest;import javalangreflectMethod;public class ClassTest { public static void main(String[] args) {

//获取class对象的方式一

Student stu = new Student();

Class class1 = stugetClass();

/

返回一个包含某些 Method 对象的数组,

这些对象反映此 Class 对象所表示的类或接口(

包括那些由该类或接口声明的以及

从超类和超接口继承的那些的类或接口)的公共 member 方法。

/

Method[] method = class1getMethods(); //method[]数组存放的是Method对象

int length = methodlength;

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

Systemoutprintln(method[i]getName()); //method[i]就是一个Method对象

}

/

你要明白class1对象的来源是Student,那么返回的构造函数,方法,属性等信息就和这个类有关

其他构造函数,属性的反射就举例子了, 道理是一样的

/

//获取class对象的方式二

Class class2 = Studentclass;

//获取class对象的方式三

Class class3 = IntegerTYPE;

}

}

1、在Java中,所有的数组都有一个缺省的属性length,用于获取数组中元素的个数。

2、数组的复制:Systemarraycopy()。浅拷贝

3、数组的排序:Arrayssort()。

4、在已排序的数组中查找某个元素:ArraysbinarySearch()。

5、获取Class的三种方式:

(1)利用对象调用getClass()方法获取该对象的Class实例;

(2)使用Class类的静态方法forName(),用类的名字获取一个Class实例;

(3)运用class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用TYPE来获取相对应的基本数据类型的Class实例。

以上就是关于java 中反射机制和内省机制的区别全部的内容,包括:java 中反射机制和内省机制的区别、java 怎样获得一个类的当前对象、js 如何根据class获取对象等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存