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 生命周期
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 生命周期