反射和注解

来源:互联网 发布:mac上流程图软件 编辑:程序博客网 时间:2024/04/24 18:58
1.反射  
1》java语言中 静态的成员和 普通的数据类型类不是面向对象的 ,但是普通的数据类型有包装类弥补 
2》类是谁的对象呢 ??
类是对象,类是java.lang.Class类的实例对象  
任何一个类都是Class的实例对象 ,这个实例对象有三种表示方法
1.  Class c1=FOO.class      类名.class
任何一个类都有一个隐含的静态成员变量
2.已知道该类的对象 通过getclass方法获得  
 Class c2=foo1.getClass();
前两种表示了FOO类的类类型  ,。-----类这个对象称之为 类类型 
System.out.println(c1==c2);----true    -------类是class的实例对象,只有一个实例对象  
3.c3=Class.forName(com,imooc.reflect.Foo);----需要异常捕获---处理 ClassNotFoundException 错误 


3》c1.newInstance()----c1 c2 c3  都可以创建类的实例对象 
  FOO foo=(Foo)c1.newInstance();    ----捕获异常  ----InstantiationException   IllegalAccessException






--------------------------------------------------------------------------
什么是动态加载 ???什么是静态加载 ???
Class.forName("类的全称")   
不仅表示了类的类类型,还代表了动态加载类   


编译时刻的加载类是静态加载类  运行时刻加载类是动态加载类
new 创建对象 是静态加载类  再编译时刻就需要加载所有的可能使用到的类  


----------------------------------------------------------------------------
Class c1=int.class
Class c2=String.class  String类的类类型 ,相当于String的字节码   
Class c3=double.class
Class c4=Double.class    这两个不是一个
Class c5=void.class


System.out.println(c1.getName);//打印类的全称  
c2.getSimpleName()  不包含包名的类的名称


-----------------------------------------------------------------
Class 的基本的API
获取任意一个类的全部的信息


public class ClassUtil{
  
 public static void printClassMessage(Object obj){
//首先获取类的信息  首先要获取类的类类型  
   
   Class c=obj.getClass();//传递的是哪个子类的对象  c就是该子类的类类型对象  
  c.getName();//获取类的名称
  //在java中 方法是Method的对象  
   //Method类 ,是一个方法对象    一个成员方法就是一个Method对象 
   Method[]ms=c.getMethods();获取的是所有的public的方法 包括从父类继承而来的 方法  
   c.getDeclaredMethods()获取的是所有该类自己声明的方法 ,不问访问权限 
   ms.getName();//得到方法的名字 
   Class returntype=ms[i].returnType();//得到方法的返回值类型 
   System.out.println(returnType.getName());
   
   Class paramTypes=ms[i].getParamterTypes();
   for(Class c:paraTypes){
   System.out.println(c.getName());
//成员变量也是对象  
  java.lang.reflect.Field
   Field类封装了关于成员变量的操作 
  getFields()方法获取的是所有的public的成员变量的信息 
   getDeclaredFields 获取的是该类自己声明的成员变量的信息  
  
Field[]  fs=c.getDeclaredFields();
 for(Field field:fs){
  //得到成员变量的类型的类类型  
  Class fieldType=field.getType();
  String typeName=fieldType.getName();
   //得到成员变量的名称 
  String fieldName=field.getName();
  System.out.println(typeName+""+fieldName);
}




//要想获取类的信息 首先要获取类的类类型  
  打印对象的构造函数的信息 
  Class c=obj.getclass();
  //构造函数也是对象  
   java.lang.Constructot中封装了构造函数的信息  
  getConstructots获取所有的public的构造的方法  
  getDeclaredConstructors  得到所有的构造函数 




-----------------------------------------------------------------------------------------
方法的反射 
1》如何获取某一个方法  
 方法的名称和方法的参数列表才能唯一决定某一个方法  
2》方法的反射操作 
method.


-----------------------------------------------------------------------------------------
java  中集合的泛型,是防止错误输入的,只在编译阶段有效。 编译之后,就不存在泛型了,就是去泛型化了 


反射的操作 Method操作 class的操作 都是绕过编译去执行的 




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


注解的分类 
按照运行机制分 :
源码注解  
编译时注解 
运行时注解 --在运行阶段还会起作用 
@Autowired  讲程序自动注入进去 再Spring中   
-----------------------------------
自定义注解的语法要求 
Target  作用域     Rention  生命周期 











































































































0 0
原创粉丝点击