-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
一反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。
Person p = new Person();
要想这样使用,首先你必须得到class文件对象,其实也就是得到Class类的对象。
Class类:
成员变量 Field
构造方法 Constructor
成员方法 Method
获取class文件对象的方式:
A:Object类的getClass()方法
B:数据类型的静态属性class
C:Class类中的静态方法
public static ClassforName(String className)
常用:第三种。
为什么呢?因为第三种是一个字符串,而不是一个具体的类名。这样我们就可以把这样的字符串配置到配置文件中。
通过Class对象获取构造方法、成员变量、成员方法:
1).构造方法:
---批量的;
Constructor[] getConstructors():获取所有的"公有"构造方法;
Constructor[] getDeclaredConstructors()::获取所有的(包括私有的)构造方法;
每一个Constructor内部都包含了"一个构造方法"的详细信息;
---单个的
public Constructor getConstructor(Class ...parameterTypes):获取某个公有的构造方法
public ConstructorgetDeclaredConstructor(Class>... parameterTypes):获取某个构造方法(包括私有的)
---实例化对象:
1).Class--->newInstance();
2).Constructor-->newInstance();
---设置暴力访问:
setAccessible(true);
2).成员属性:
------批量的:
Field[]getFields():获取所有公有的成员变量
Field[] getDeclaredFields():获取所有成员变量(包括私有)
----单个的:
FieldgetField():获取单个,公有的成员变量
FieldgetDeclaredField():获取单个的成员变量,包括私有的
----为成员变量赋值:
Filed--> set(Object obj,Object value)
3).成员方法:
----批量的:
Method[]getMethods():获取所有公有的成员方法;
Method[]getDeclaredMethods():获取所有的成员方法包括私有的。
----单个:
MethodgetMethod():获取单个公有的成员方法;
MethodgetDeclaredMethod():获取单个成员方法,包括私有的;
----调用方法:
Method--> public Object invoke(Object obj,Object... args)
通过反射越过泛型检查:有一个具有String泛型的ArrayList,问:怎么可以向集合中添加一个数字:
具体代码体现:
public class Demo {
publicstatic void main(String[] args) throws Exception{
ArrayList
// strList.add(20);
//泛型,只在"编译期",生成class后,泛型就没有了
//1.获取ArrayList的Class对象
ClasslistClass = strList.getClass();
//2.获取add()方法
MethodaddMethod = listClass.getMethod("add", Object.class);
//3.调用Method对象的方法,执行add()方法
addMethod.invoke(strList,20);
addMethod.invoke(strList,30);
addMethod.invoke(strList,"abc");
//测试:遍历strList
for(Objectobj : strList){
System.out.println(obj);
}
}
}
二.设计模式:
1,代理模式
2.模板模式
3.装饰模式
着重理解代理模式。
代理模式:
1.在不改变原类的基础上,可以为原类增加一些其他功能;
2.当有代理后,我们可以直接面对:代理类
有一个类,访问数据库中的Student表:
classStudentService{
publicvoid add(){
//添加一条Student信息;
}
publicvoid delete(){
//删除数据库中一条Student信息;
}
}
现在要求,在不更改原类的基础上,在调用这两个方法时,都要做两个操作:
1.在调用此方法之前:检查:是否有权限;
2.在调用此方法之后:写日志;
建立一个"代理类",后期使用,直接使用此代理类;
缺陷:如果其它类,也需要加这两个方法,也得添加代理类,这样会导致类太多;
所以就有了动态代理模式。
之前的代理模式有个缺陷,如果其它类也需要增加那两个操作,也必须要增加一个代理类,
这样使用起来比较麻烦;
Java中提供了"动态代理":不需要"代理类",动态代理机制会为要代理的类,自动产生一个代理对象;
Java中的动态代理是基于"接口"的,需要代理的类,一定要是某个接口的实现类;
步骤:
1.定义一个类,实现:InvocationHandler
2.在使用时,使用Proxy:newProxyInstance()方法产生代理对象;
三.JDK5的新特性:
1.自动装箱和拆箱
2.泛型
3.增强for循环
4.静态导入
5.可变参数
6.枚举
四.JDK7的新特性:
1.二进制字面量
2.数字字面量可以出现下划线
3.switch 语句可以用字符串
4.泛型简化
5.异常的多个catch合并
6.try-with-resources 语句
五.JDK8的新特性:
1.接口可以有方法了。
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------