黑马程序员——高新技术---Java基础-反射

-----------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<String>strList = new ArrayList<>();

//        strList.add(20);

 

//泛型,只在"编译期",生成class后,泛型就没有了

//1.获取ArrayListClass对象

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.在使用时,使用ProxynewProxyInstance()方法产生代理对象;

 

.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培训、期待与您交流! -------

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值