欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

027.1 反射技术 Class

程序员文章站 2022-07-02 15:44:48
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所 ......

java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是class类中的方法.所以先要获取到每一个字节码文件对应的class类型的对象.
反射技术解决问题:初始代码固定后,减少修改代码,动态获取类
在普通类上层还有类,class类,加载文件的时候就创建了class对象

######################################################################
获取class对象的方式:
######一:通过object的getclass方法获取,反射技术不适用这种方法
通过对象调用getclass方法

person p1 = new person();
person p2 = new person();
class clazz1 = p1.getclass();
class clazz2 = p2.getclass();
system.out.println(clazz1 == clazz2);//true
//        system.out.println(clazz1.getname());//获取类的名字。

 

######二:每个数据都有默认的静态属性,.class,用该属性就可以获取字节码文件对象
通过类.class获取。
class clazz = person.class;

######三:forname方法,通过名称就可以获取对应的字节码文件对象,常用方法

string classname = "cn.itcast.domain.person";          //类名前面需要加包名#########################(重)
// 1,通过给定的类名称,加载对应的字节码文件,并封装成字节码文件对象class.
class clazz = class.forname(classname);
//        system.out.println(clazz);

//通过newinstance()就可以创建字节码对象所表示的类的实例。
/*
 * 2,通过new创建给定的类的实例。
 * 3,调用该类的构造函数。
 * 通常被反射的类都会有提供空参数的构造函数。
 * 没有对应的构造函数,会报instantiationexception
 * 如果有提供,但是权限不够,会报illegalaccessexception
 */
object obj = clazz.newinstance();

/* person p = new person();
 * 1,加载person类,并将person类封装成字节码文件对象。
 * 2,通过new创建person对象。
 * 3,调用构造函数对对象初始化。
 */
system.out.println(obj);

 

#########################################################################
创建构造函数

string classname = "cn.itcast.domain.person";
class clazz = class.forname(classname);

//获取指定的构造器。获取person类中两个参数string,int的构造函数。
constructor cons = clazz.getconstructor(string.class,int.class);

//有了构造器对象后,通过构造器对象来初始化给类对象。
object obj = cons.newinstance("wangwu",23);
//person p = new person("lisi",21);

system.out.println(obj);