反射机制的简单使用
2016-07-17 22:17
239 查看
从7月11号开始了在公司的实习生活,以新的状态开始面对工作。因为整个暑假都是进行培训,所以从这一篇开始,我将记录我的学习笔记。
在开始写框架之前,有一个非常重要的知识点将贯穿整个项目--反射机制。掌握了它,整个项目将变得非常轻松
那为什么会有这个机制的出现?它的应用场景是什么呢?在开发中,我们可能通过网络或者文件等形式得到类名,在运行时才清楚要实例化哪个类,这就是反射机制的应用场景之一。
a、getMethod(String name,Class<?>...
parameterTypes)可以获得此 Class 对象所表示的类或接口的指定公共成员方法。而getDeclaredMethod(String name,Class<?>...
parameterTypes)方法可以获得此 Class 对象所表示的类或接口的指定成员方法,包括私有方法。
b、上面两个方法中,第一参数name表示所要获得方法名,第二是一个可变长参数,即参数的个数不定,参数含义是方法的形参类型class对象。
c、上述方法的返回对象是Method类型,若要执行这个方法还要调用其invoke()。同样的,这个invoke()有两个参数,第一个参数代表这个类的实例对象引用。第二参数仍然是可变长参数,代表这个方法所需要的实参。
d、若Method对象所代表的是一个私有对象,则加上.setAccessible(true)
d、其他具体的应该查看API文档,越发觉得是个好东西。
以上。(PS:整理的比较简单,了解的也不深)
在开始写框架之前,有一个非常重要的知识点将贯穿整个项目--反射机制。掌握了它,整个项目将变得非常轻松
1、什么是反射机制?
标准的定义我就不粘贴了,按我的理解便是:在运行时,可以通过一个类名去获取这个的相关信息,包括其构造函数、方法信息、成员变量信息,并使用这些信息(改变成员变量的值、执行方法等)。那为什么会有这个机制的出现?它的应用场景是什么呢?在开发中,我们可能通过网络或者文件等形式得到类名,在运行时才清楚要实例化哪个类,这就是反射机制的应用场景之一。
2、如何使用
第一步:得到类的Class对象。
<span style="font-family:Microsoft YaHei;font-size:18px;">//第一种,调用Class的静态方法 Class c=Class.forName(“className”); //第二种,.class语法 Class c=String.class; //第三种 String str=""; Class c=str.getClass(); </span>
第二步:通过Class对象获取类的相关信息。
主要讲一下几个需要注意的地方a、getMethod(String name,Class<?>...
parameterTypes)可以获得此 Class 对象所表示的类或接口的指定公共成员方法。而getDeclaredMethod(String name,Class<?>...
parameterTypes)方法可以获得此 Class 对象所表示的类或接口的指定成员方法,包括私有方法。
b、上面两个方法中,第一参数name表示所要获得方法名,第二是一个可变长参数,即参数的个数不定,参数含义是方法的形参类型class对象。
c、上述方法的返回对象是Method类型,若要执行这个方法还要调用其invoke()。同样的,这个invoke()有两个参数,第一个参数代表这个类的实例对象引用。第二参数仍然是可变长参数,代表这个方法所需要的实参。
d、若Method对象所代表的是一个私有对象,则加上.setAccessible(true)
d、其他具体的应该查看API文档,越发觉得是个好东西。
<pre name="code" class="java">package com.test; import java.lang.reflect.Constructor; import java.lang.reflect.Method; //功能:测试案例以及学习jdk源码 public class test { public static void main(String args[]){ try { Class c=Class.forName("com.test.User");//一定要类的全名,比如"java.lang.String" User u=(User) c.newInstance();//得到这个类的一个实例对象 //可变长参数 Method m1=c.getMethod("init", String.class,int.class);//第二个参数代表参数类型 m1.invoke(u,"Lucy",2);//第二个参数代表要传入的实参 //私有方法 Method m2=c.getDeclaredMethod("display",null); m2.setAccessible(true);//关键,访问私有方法一定要有 m2.invoke(u, null); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } } class User { public String name; public int age; public void init(String name,int age){ this.name=name; this.age=age; } private void display(){ System.out.println("name="+name+",age="+age); } }
以上。(PS:整理的比较简单,了解的也不深)
相关文章推荐
- varchar长度需要是2的倍数吗?
- android 打造不同的Seekbar
- spark的submit
- rootkit的检测工具使用(chkrootkit和rootkit hunter)
- android 打造不同的Seekbar
- android 打造不同的Seekbar
- rootkit的检测工具使用(chkrootkit和rootkit hunter)
- 工作第一周 : 适应节奏!
- jstl标签和EL表达式知识点归纳
- Android开发 Java解析Json字符串
- JSP的Model1和Model2架构模式的分析比较
- listview 加载的时候报java.lang.IllegalArgumentException: column ‘_id’ does not exist 错误
- 5个最佳免费Linux杀毒软件
- 5个最佳免费Linux杀毒软件
- Git常见使用方法
- STM32入门之新建工程
- 索引
- python学习——itertools
- POJ 3233 Matrix Power Serie (矩阵快速幂)
- Python学习