反射( java.lang.reflect包) : java 的灵魂
Class forname(类名) 加载类。
反射是什么?
反射做什么?
反射与动态多态的关系。
Java中的方法代码放到内存的代码段中。
类模板对象 class 只有一个
实例对象 Student 可以有无数个
class类加载的时候 记录类的信息。 Jvm使用,只被加载一次。(所以静态代码块值被加载一次。)
反射机制API:
在运行时探究和使用编译时未知的类。 可以得到这个类的calss对象。
先加载到jvm 获得这个类的类模板对象。
反射使用步骤:
1.获得你想操作的类的java.lang.calss对象
2.调用诸如getdeaclaredmethods的方法(属性、构造方法等)
3.使用reflection api来操作这些信息
虚拟机只做到第二步
反射中获取对象
1.调用实例对象继承于object的getclass方法
可以得到所有类和数组的class对象。
没有编译时未知,运行时探究的动态效果。
2.利用语法类型名.的方式获取到class对象
Class dogclass= dogbean.class;可以得到int的ckass'对象,class只能在jdk1.5cl,5以后使用。
Class intclass = integer.tyope;
2,利用所有类型()都可以得到相应的class对象
没有编译时未知运行时探究的动态效果
Class利用dog ,获取class对象
3.利用class.forName(“**************”)获取class对象 -- 动态加载
特点:
不支持基本数据类型、返回类和数组获取相应class对象
唯一有编译时,运行时探究的动态效果
二
探究类的信息
1.探究类的基本声明部分。
xxClass.getPackage.getName();探究包名
XxClass.getName();探究类全名,类的限定名。
Xxclass.getSimpleName();类的简单名
XxClass.getModifiers();得到修饰符---范文修饰符和可选修饰符
Modifier.toString(intmod)//使用工具类把整形的修饰符装换成字符串的表示
XxClass.getSuperclass();//得到当前类的父类
XxClass.getInterfaces();//返回一个数组,得到接口
2.探究所有属性:--Field
XxClass.getFields();//得到所有的公共属性,包括从父类继承来的公共属性;--返回一个数组;
Allfields = XxClass.getDeclaredFields()’;//得到类中所有申明的属性(不包括来自父类的属性);
Xxclass.getField(“name”);//得到指定的公共属性,包括父类继承而来的。
Xxclass.getdeclaredField(“age”);?/得到指定的申明属性,不包括父类继承而来的。
Allfields.getname();属性名
Allfields.gettype().getsimplename();--属性类型
Modifier.tosteing(Allfields.getModifiers)
构造--constructor
属性--Filed
方法--Method
探究构造--constructor
构造方法全名就是类全名
Xxclass.getConstrictors();、、得到所有公共的构造方法;
Xxclass.Getdeclaredconstructs// 得到所有申明的构造
xxclass.getConstructor();得到指定的公共构造
xxclass.getConstructors();得到指定申明的构造
Modifier.tosString(con.getModifiers);、、构造方法修饰符
Con.getName();//构造方法名
cLass[] xxx = con.getParameterTyoes()//得到形参列表
Class[] xxx = con.getExceptioTypes()、、//的到异常类型
探究方法--Method
Method[] allpm = xxClass.getMethods();
Method[] allpm = xxClass.getDeclaredMethods();
3.使用探究到的类的信息
1.使用法术创建对象-- java中第三章创建对象的方法
根据探究到的constructor对象,产生类的实例对象
好处可以调用类中的任意构造方法,
但是实现过于麻烦。
xx.setAccessible(true);//设置某个对象的访问权限为可访--不到万不得已不能用;
2.直接利用class对象产生实例对象l
好处:代码非常的简洁。
坏处:只能调用公共无参构造
DogBean dog = null;
dog = (DogBean)dogclasss.newInstance();
3.操作属性
Field thePublicFiled = dogClass.getFeild(“name”);//公共属性
Field thePublicFiled = dogClass.getFDclaredeild(“name”)
ThePublicFiled.set.(dog1,”xiaobai”;第一个参个哪个对象的那么属性赋值,第二个参赋值的内容;
ThePublicFiled.get(“dog1”);得到某个对象的值
4.调用探究到的方法--invoke
Method thepublicf =
test(1,2,3,4,6);
Public void test(int... Array){
}
当数组做形参的时候用该语法。

2271

被折叠的 条评论
为什么被折叠?



