黑马程序员之java学习笔记12

1. System.out.prinltn((String.class).getName())的结果是包括包名的类的全称,java.lang.String

2. Integer.TYPE返回的int,而Integer.class返回的是Integer类所对应Class对象。其它包装类Byte,Long)(的情况也一样。

3. 反射能调用类的私有成员变量和方法,通过Method对象的setAccessibe(true)压制java访问权限的检查,使得private的方法也能调用,这就打破了类的封装性。

4. classType.getMethod(String name, Class<?>…parameterType)只能返回该Class对象指定的public成员方法。而classType.getDeclaredMethod(String name, Class<?>…parameterType)没有这个限制。

5. 反射方式调用类的私有方法具体操作:

   Person p = new Person();

   Class<?> clazz = p.class;

   Method method = clazz.getDeclaredMethod(privateMethod, new Class[]{String.class}

   method.setAccessibale(true);

Object obj = method.invoke(p, new Object[]{“hello”};

6. 反射方式改变类的成员变量的值:

  Person p = new Person();

   Class<?> clazz = p.class;

   Field filed = clazz.getDeclaredField(“name”);

   filed.setAccessiable(true);

   field.set(p,”lisi”);

 

7. Class对象只能由JVM创建,Class对象是在类被加载后由JVM创建。

8. 代理模式的作用:为其他对象提供一种代理以控制对该对象的访问。

9. 代理的三种角色:抽象角色,真实角色,代理角色。抽象角色定义真实角色和代理角色的共同接口;真实角色是我们正在要使用的对象;代理角色里面要有真实角色的引用,同时可能定义一些附加的功能。

10.静态代理:事先知道要代理的真实对象。动态代理:事先不知道要代理的真实对象。

11.生成动态代理的步骤:

   使用接口创建一个抽象角色类-à创建一个真实角色类实现抽象角色类的接口à创建一个代理角色类,实现接口InvocationHandlerinvoke(Object proxy, Method method,Object[] args)方法--à在客户端中的main方法调用Proxy的静态方法newProxyInstance(ClassLoader loader, Class[] interface, InvocationHandler h)创建一个代理实例à通过代理实例调用抽象角色类的抽象方法,这时流程转给InvocationHandler类对象handler处理,调用handlerinvoke方法,通过method.invoke(传进来的正真角色类的对象,args)来完成动态代理。其中proxy,method,args已在newProxyInstance方法中动态的生成好了。

12. 每一个Proxy实例都会相关一个InvocationHandler类实例,当在proxy instance上调用一个方法时,就会去调用相关的InvocatioonHandler实例的invoke方法。

13. Proxy的静态方法newProxyInstance(ClassLoader loader, Class[] interface, InvocationHandler h)会根据Class[] interface(类实现的接口)动态的生成一个类,并返回一个Object的代理实例。所以定义类有两种方式:一种是普通方式class ClassName(){}这种方式,另一种是动态的生成类。

14.动态代理主要用到一个类和一个接口:InvocationHandler接口(invoke方法)Proxy(Proxy.newInstanceProxy方法)

15. 不论是类还是接口都有.class方法,不论是类还是接口都有getClassLoader()方法。如,Foo是一个接口,也能这样使用Foo.class获得Class对象,Foo.class.getClassLoader()获取加载器。

16. 注解<Annotation>可以用在类上,也可以用在方法上,还可以用在属性上。

17.自定义注解类方式:

public @interface A{

    String value();//定义的是一个value属性,只不过后面跟着(),一定得这种方式定义属性。

}

18.如何调用自己定义的注解

 

@A(value=”aa”)//@A(“aa”)

Public class AnnotationTest{

     @A(value=”bb”)//@A(“bb”)

 

     Public void getName(){

        Return name;

 

}

1.       小结:当且仅当注解类的属性为value时,在给属性赋值既可以@A(value=”aa”),也可以省去value@A(“aa”),其他的属性名必须的@A(value=”aa”)这种方式。

2.       @A({“aa”,”bb”,”cc”}),当属性值有多个时,必须得使用大括号,因为是数组。当是当个属性值时,为了简便,大括号可以省去,只使用小括号,如@A(“aa”),。

 

21 .3大常用注解:@Override,@Deprecated,@SuppressWarning

@Override注解表示被Override注解的方法必须得重写父类对应方法,父类没对应方法就会报错。

@Deprecated注解表示过时,不建议使用的意思。

@SuppressWarning(“unchecked”):表示压制括号内的警告。

22. 异常(Exception;定义在java.lang.Exception类中,异常分为两大类,运行时异常(Runtime Exception)又称Unchecked Exception,非运行时异常(checked Exception)该类是所有异常的父类。

23. Exception继承Throwable类,与Exception对应的是Erro类,ExceptionErro都是Throwable的子类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值