java中反射的作用及用法

来源:互联网 发布:陕西省中小学网络竞赛 编辑:程序博客网 时间:2024/06/04 17:54

 

一、动态加载类

1、静态加载类

编译时,加载的类是静态加载类。

Foo foo = new Foo();

创建对象是静态加载类,编译时就要加载所有要用到的类,如果其中 1 个类有问题,就无法通过编译。解决该问题,可以使用动态加载类。

 

2、动态加载类

运行时,加载的类是动态加载类

Class.forName("com.reflect.Foo");

编译时不检查用到的类是否存在,运行时再检查。

new创建对象是静态加载类,在编译时进行加载,如果程序中其他的类有问题,那么没有问题的类也是无法执行的
解决这个问题可以使用动态加载
Word w=new Word();静态加载
Class c=Class.forName(类的绝对路径);动态加载
c叫做类的类类型,也可以通过类类型创建实例
c.newInstance();
 
功能性的类最好使用动态加载,而不是静态加载。动态加载类指的是程序运行时加载类,而静态加载指的是编译时加载类,编译时加载的缺点是程序中所有的功能都不能有差错,否则的话程序就不能用了,而动态加载类的好处就是我们需要使用哪一个类虚拟机就会动态加载根据我们的需要动态的加载这个类,这样程序的使用就不会受到其他的影响
二、java获取方法信息
1.Class
  1) 在面向对象的世界里,万事万物皆对象。(java语言中,静态的成员、普通数据类型除外)
   类是不是对象呢?类是(哪个类的对象呢?)谁的对象呢?
   类是对象,类是java.lang.Class类的实例对象
  2)这个对象到底如何表示
  3 )Class.forName("类的全称")
       不仅表示了,类的类类型,还代表了动态加载类
       请大家区分编译、运行
       编译时刻加载类是静态加载类、运行时刻加载类是动态加载类
  4)基本的数据类型、void关键字  都存在类类型 
  5)Class类的基本API操作
  
2.方法的反射
1)如何获取某个方法
    方法的名称和方法的参数列表才能唯一决定某个方法
2)方法反射的操作
   method.invoke(对象,参数列表)
3)为什么要用方法的反射
    why?指定方法名称调用方法
    举个实际应用的案例  ---->通过标准JavaBean的属性名获取其属性值
    BeanUtil
3、Class类的基本API操作
1)、获取方法信息
Method类,方法对象
一个成员方法就是一个Method对象
getMethods()方法获取的是所有该类自己声明的方法,包括父类继承而来的方法
getDeclaredMethods()获取的是该类自己声明的方法,不问访问权限
Method[] ms=c.getMethods();
for(int i=0;i<ms.length;i++){
Class returnType=ms[i].getReturnType();//得到方法的返回值类型
System.out.println(returnType.getName()+””); System.out.print(ms[i].getName()+”(”); //得到方法名称
//获取参数类型
Class [] paramTypes=ms[i].getParameterTypes();
for(Class class1:paramTypes){
System.out.print(class1.getName()+”,”);
}
System.out.println(“)”);
}

 

2)、获取成员变量信息

成员变量也是对象

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 field Name=field.getName();

System.out.println(typeName+” ”+fieldName);

}

 

3)、获取构造函数信息

构造函数也是对象

Java.lang:ConStructor中封装了构造函数的信息

getConStructors获取所有的public的构造函数

getDeclaredConstructors获取所有构造函数

Constructor []cs=c.getDeclaredConstructors();

for(Constructor constructor:cs){

System.out.print(constructor.getName()+”(“);

Class []paramTYpes=constructor.getparameterTtpes();

for (Class class1:paramTypes){

System.out.print(class1.getName()+”,”);

}

System.out.println(“)”);

}

注意:Java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译就无效了

原创粉丝点击