JAVA加强2总结


Java Bean:

JAVA Bean 是一种特殊的JAVA类,主要用于传递数据信息,这种JAVA类中的方法主要用于访问似有字段,
且方法名符合某种命名规则。属性私有,方法公有化。
它是一种软件组件模型,他与其他软件对象相互作用,决定如何建立和重用软件组件,这些可重用软件组件就被称为JavaBean.

Sun公司对JavaBean规范的定义如下:"JavaBean,是一个基于Sun公司的JavaBean规范的,可复用的软件组件"。
通过这个定义可以看出,能够被称为JavaBean的JAVA类必须符合以下一定的规范的要求。
如果类型属性名字是xxx,类型为proptype,则在类中必须定义用来获取或更改属性值的两个方法:
public proptype getXxx(){};用来获取属性xxx的值
public void setXxx(proptype x){}; 用来设置属性的xxx的值

如果定义构造函数,那么这个构造函数必须是无参的。
因此,符合商住两点设计规则的任何Java类都是JavaBean.
 
JDK中提供了对javaBean 进行操作的一些API,这套API就称为内省。
如果要你自己取通过getX方法访问似有x,怎么做,有一定难度吧?用内省这套API才做JAVABEAN
比用普通的方式更方便。


=====================================================================================


内省
IntroSpector ---检查;视察(内省)对内部进行检查,了解更多的底层细节。
主要对javabean进行操作

当java类被当做javaBean使用时,javaBean的属性是根据方法名推断出来的,它根本看不到java类
内部的成员变量。


用JAVABEAN方式来操作元素的取值和赋值

String propertyName = "i";
  ReflectPoint fp1 = new ReflectPoint(5,10); //实例化对象
  
  PropertyDescriptor property = new PropertyDescriptor(propertyName,fp1.getClass());//得到元素在哪个方法中。
     Method method  = property.getReadMethod();   //返回PropertyDescriptor的javabean方式的方法。一般为getxx
     Object getvalue = method.invoke(fp1);  //用方法的构造方法。因为只需要取某元素的值,不必要操作字段所以只放一个就可以了。
   
    
     Method method2  = property.getWriteMethod();
     method2.invoke(fp1,125);


//也可以将上面的操作封装成一个方法:
public static Object getobj(Object obj,ReflectPoint r) throws Exception{
  PropertyDescriptor pd = new PropertyDescriptor(obj.toString(),r.getClass());
  Method method = pd.getReadMethod();
  return method.invoke(r);
 
 }

----------------------------------------------------------------------------
内省(introspector)综合案例:
一般的做法是通过类Introspector的getBeanInfo方法获取某个对象的BeanInfo 信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性

对应的getter/setter方法,然后我们就可以通过反射机制来调用这些方法

采用遍历BeanInfo 的所有属性方式来查找和设置某个RefectPoint对象的X属性,在程序中
把一个类当做JAVAbean来看,就是调用IntroSpector.getBeanInfo方法,得到的BeanInfo对象分装了
把这个类当做JavaBean看的结果信息然后封装到beaninfo中。
============================================================================

开发过程中将要常用的工具包,BeanUtil.jar

===========================================================================
了解注解及java 提供的几个基本注解
1.5以后版本的新特性
枚举和注解。

一个注解相当于一个,当调用一个注解的时候就属于调用了这个类

@SuppressWarnings("deprecation");  //当某方法过时时调用该注解,忽视提示过时信息。
@Deprecated //该注解代表方法已经过时,但是却依然可用,只是该方法名会被横线划掉,不建议使用
但是曾经使用该方法的用户依旧可以使用并且通过。

@Override //声明该方法覆盖父类,重写父类,如果成功则不报错,反之则报错。
总结:
注解相当于一种表记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,
以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事,标记可以加在包,类,字段,方法,方法的参数以及局部

变量上。
AnnotacationTest // 注解测试,类名
--------------------------------------------------------------------------------------
在声明文件(@interface)中使用的声明
@Target()//声明只能在某些场合下可以使用
@Target(ElementType.METHOD) ---只能在方法上声明
@Target({ElementType.METHOD,ElementType.TYPE}) ----能在方法上也能在类上声明
详情可查看 API文档搜索ElementType

@Retention(RetentionPolicy.RUNTIME) //元注解,注解的注解,当一个注解被调用时,需要在注解上
添加一条才可以查询到。因为默认是在.class中,在内存中将不存在,所以需要声明在运行时才可以找到。
根据发射测试的问题,引出@Retention元注解的讲解,其三种取值:RetetionPolicy.SOURCE,RetetionPolicy.CLASS(默认阶段),
RetentionPolicy.RUNTIME

一个注解的生命周期,有三个阶段
RetetionPolicy.RUNTIME;分别对用:java源文件-->class文件--->内存中的字节码


------------------------------------------------------------------------------------
为注解增加基本属性
什么是注解的属性
一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是传智播客的学生,否则,就不是,如果还想区分是传至博客的哪个班的学生,这时候可以为胸牌在增加一个属性来区分,加了属性标记

效果为:@MyAnnotation(color="red")

定义基本类型的属性和应用属性:
在注解类中增加String color();
@Myannotation(color="red");

用反射方式获得注解对应的实例对象后,在通过该对象调用属性对应的方法
MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(a.color(0);
可以认为上面的 @MyAnnotation是MyAnnotation 类的一个实例对象

在声明中可以定义 String color()等字样来保存声明中的值
在声明(color ="red"); 在开始调用声明时就可以给声明中的变量复制
在调用声明中的.color时就会获得值。当然如果声明变量名字为value便可以不必加"="也可以赋值,仅仅是这个变量名而已,前提是只有value 需要设置时才可以,如果多变量时则不通过。

解决方案是可以为
多余变量设置缺省属性(默认属性)
----------------------------------------------------------------------

例子代码:
                       public static void main(String[] args)  {
   if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){
    //判断ItcastAnnotation是否存在
    ItcastAnnotation annocation  =AnnotationTest.class.getAnnotation(ItcastAnnotation.class);                                     
    System.out.println(annocation.color());
   }
 
 }


@Retention(RetentionPolicy.RUNTIME) //修改该@ItcastAnnotation 存在时间,默认为.class
public @interface ItcastAnnotation {
String color ();
}

======================================================================================

===========================================================================================
类加载器
*简要介绍什么事类加载器和类加载器的作用
*JAVA虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:
(父亲)BootStrap--->JRE/lib/rt.jar, ---专门承载一些JAVA初始的类,例如System等
(儿子)ExtClassLoader--->JRE/lib/ext/*/jar,
(孙子)AppClassLoader --->CLASSPATH指定的所有jar或目录


-------------------------------------------------------------------------------------------
 类加载器的委托机制
当JAVA虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?
*首先当前线程的类加载器去加载线程中的第一个类。
*如果类中A引用了类B,JAVA虚拟机将使用加载类A的类加载器来加载类B
*还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。

每个类加载器加载类时,又先委托给其上级类加载器。
*当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChild方法,及时有,多个儿子,要

找一个呢?
*对着类加载器的层次结构图和委托加载原理,解释先将ClassLoaderTest输出成jre/lib.ext目录下的itecast.jar包中后,运行结果为ExtClassLoader的原因。
-------------------------------------------------------------------------------------------
有一道面试,能不能自己写个类叫java.lang.System,为了不让我们写System类,类加载采用委托机制,
这样可以保证爸爸们有限,也就是总是使用爸爸们能找到的类,这样总是使用java系统提供的System.

通常不可以,因为使用委托机制在子类中写过后也不会被调用,因为在爷爷中就已经找到,所以不会执行到下级。但是也可以自己写一个类加载去加载指定的位置。

-------------------------------------------------------------------------------------------

编写自己的类的加载器
模板方法设计模式
父类-->loadClass/findClass/得到class文件的转成字节码-->definClass()方法实现
覆盖find方法是为了保留loadClass中的流程。如果覆盖了loadClass那么就不在使用父类而是指定的类自己干了。我们只是为了要做局部细节,所以只覆盖findClass就可以了
loadClass是找爸爸方法,当找到之后再执行内部的findClass

编程步骤:
编写一个对文件内容进行简单加密的程序。
编写了一个自己的类装载器,可实现对加密过的类进行装在和解密。
编写了一个程序调用类加载器加载类,在原程序中不能用该类名定义引用变量,因为变异器无法识别这个类。程序中可以出了使用ClassLoader.load方法之外,还可以使用

 

 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------
一个类加载器的高级问题分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值