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获取对象等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)