javaweb学习总结四(反射技术)
一:反射的概念
反射就是加载类,然后获取类的属性、方法、构造函数等。
二:加载类到内存(有硬盘字节码文件到内存)
三种加载类的方式:
@Test
// 测试加载类
public void test1() throws Exception {
// 第一种方式
Class clazz1 = Class.forName("com.hlcui.test.Person");
// 第二种方式
Class clazz2 = new Person().getClass();
// 第三种方式
Class clazz3 = Person.class;
}
三:反射类中的组成部分
1:使用getConstructor()、getMethod()、getField(),可以反射public修饰的成员,
如果需要反射private修饰的成员,需要使用下面的getDeclaredXXX()。
2:反射构造方法
Person定义的构造方法:
public Person() {
System.out.println("调用无参构造方法...");
} public Person(String name) {
System.out.println(name);
} public Person(String name, int age) {
System.out.println(name + ":" + age);
} private Person(List<String> list) {
System.out.println(list);
}
反射构造方法代码:
@Test
// 反射无参构造方法
public void test2() throws Exception {
Class clazz1 = Class.forName("com.hlcui.test.Person");
Constructor c = clazz1.getConstructor(null);
Person p = (Person) c.newInstance(null);
System.out.println(p.name);
} @Test
// 反射参数String的构造方法
public void test3() throws Exception {
Class clazz1 = Class.forName("com.hlcui.test.Person");
Constructor c = clazz1.getConstructor(String.class);
Person p = (Person) c.newInstance("Jack");
System.out.println(p.name);
} @Test
// 反射参数为String、int的构造方法
public void test4() throws Exception {
Class clazz1 = Class.forName("com.hlcui.test.Person");
Constructor c = clazz1.getConstructor(String.class, int.class);
Person p = (Person) c.newInstance("Jack", 27);
System.out.println(p.name);
} @Test
// 反射参数为List的构造方法
public void test5() throws Exception {
Class clazz1 = Class.forName("com.hlcui.test.Person");
Constructor c = clazz1.getDeclaredConstructor(List.class);
c.setAccessible(true);
Person p = (Person) c.newInstance(new ArrayList());
System.out.println(p.name);
}
其中反射参数为List的构造方法,因为构造方法时private修饰的,所以必须使用getDeclaredConstructor()获取构造方法,
同时需要设置强制方法setAccessible(true);
也可以直接使用反射类获取对象,代码如下:
@Test
public void test6() throws Exception {
Class clazz1 = Class.forName("com.hlcui.test.Person");
Person p = (Person) clazz1.newInstance();
System.out.println(p.name);
}
2:反射方法
反射方法代码如下:
Person类中定义的普通方法:
public void abc() {
System.out.println("abc...");
} public String abc(String name) {
return name;
} public void abc(String name, int[] i) {
System.out.println(name + ":" + i);
} public Class[] abc(InputStream in) {
return new Class[] { String.class };
} public static void abc(int i) {
System.out.println(i);
}
反射普通方法:
@Test
// public void abc()
public void test7() throws Exception {
Person p = new Person();
Class clazz1 = Class.forName("com.hlcui.test.Person");
Method m = clazz1.getMethod("abc", null);
m.invoke(p, null);
} @Test
// public String abc(String name)
public void test8() throws Exception {
Person p = new Person();
Class clazz1 = Class.forName("com.hlcui.test.Person");
Method m = clazz1.getMethod("abc", String.class);
System.out.println(m.invoke(p, "Tom"));
} @Test
// public void abc(String name, int[] i)
public void test9() throws Exception {
Person p = new Person();
Class clazz1 = Class.forName("com.hlcui.test.Person");
Method m = clazz1.getMethod("abc", String.class, int[].class);
m.invoke(p, "Jack", new int[] { 1, 2, 3 });
} @Test
// public Class[] abc(InputStream in)
public void test10() throws Exception {
Person p = new Person();
Class clazz1 = Class.forName("com.hlcui.test.Person");
Method m = clazz1.getMethod("abc", InputStream.class);
Class[] cc = (Class[]) m.invoke(p, new FileInputStream("f:/1.txt"));
System.out.println(cc[0]);
} @Test
// public static void abc(int i)
public void test11() throws Exception {
Class clazz1 = Class.forName("com.hlcui.test.Person");
Method m = clazz1.getMethod("abc", int.class);
m.invoke(null, 27);
}
Person定义的main方法:
public static void main(String[] args) {
System.out.println("调用main...");
}
反射main方法:
@Test
// public static void main(String[] args)
public void test12() throws Exception {
Person p = new Person();
Class clazz1 = Class.forName("com.hlcui.test.Person");
Method m = clazz1.getMethod("main", String[].class);
// m.invoke(p, (Object)new String[]{"1","2","3"});
m.invoke(p, new Object[] { new String[] { "1", "2", "3" } });
}
这里要注意,由于jdk5兼容了jdk1.4的特性,传入字符串数组时,它会对传入参数进行拆分,
如:new String[]{"1","2","3"}将被拆分成"1"、"2"、"3",所以直接反射会报参数个数异常,
有两种处理方法:
a:在前面加上Object b:将数组再次放到数组中
3:反射字段
Person类中定义字段:
public String name = "Tom";
private int age = 27;
private static double salary = 8000.0;
反射字段:
@Test
// public String name = "Tom";
public void test13() throws Exception {
Person p = new Person();
Class clazz1 = Class.forName("com.hlcui.test.Person");
Field f = clazz1.getField("name");
f.set(p, "Jack");
Object obj = f.get(p);
Class type = f.getType();
if (type.equals(String.class)) {
String value = (String) obj;
System.out.println(value);
}
} @Test
// private int age = 27;
public void test14() throws Exception {
Person p = new Person();
Class clazz1 = Class.forName("com.hlcui.test.Person");
Field f = clazz1.getDeclaredField("age");
f.setAccessible(true);
int i = (Integer) f.get(p);
System.out.println(i);
} @Test
// private static double salary = 8000.0;
public void test15() throws Exception {
Person p = new Person();
Class clazz1 = Class.forName("com.hlcui.test.Person");
Field f = clazz1.getDeclaredField("salary");
f.setAccessible(true);
double d = (Double) f.get(p);
System.out.println(d);
}
反射的知识就总结到这里!
javaweb学习总结四(反射技术)的更多相关文章
- JavaSE 学习笔记之反射技术(二十四)
反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好 ...
- Javaweb学习笔记7—JDBC技术
今天来讲javaweb的第7阶段学习. JDBC技术,关于JDBC本篇博客只介绍了它的一部分,后面博客会更加深入探讨. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的 ...
- javaweb学习总结(四十二)——Filter(过滤器)学习
一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...
- JavaWeb学习总结(四十九)——简单模拟Sping MVC
在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...
- JavaWeb学习总结(四十八)——模拟Servlet3.0使用注解的方式配置Servlet
一.Servlet的传统配置方式 在JavaWeb开发中, 每次编写一个Servlet都需要在web.xml文件中进行配置,如下所示: 1 <servlet> 2 <servlet- ...
- javaweb学习总结(四十七)——监听器(Listener)在开发中的应用
监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用 一.统计当前在线人数 在JavaWeb应用开发中,有时候我们需要统计当前在线的用户数,此时就可以使用监听 ...
- javaweb学习总结(四十六)——Filter(过滤器)常见应用
一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import ja ...
- javaweb学习总结(四十五)——监听器(Listener)学习二
一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...
- javaweb学习总结(四十一)——Apache的DBUtils框架学习
一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...
随机推荐
- redis的hashes类型
redis hash 是一个string类型的field和value 的映射表.它的添加.删除操作都是O(1) . hash特别适合用于存储对象.相较于将对象的每个字段存成单个string类型 . 将 ...
- Emacs和它的朋友们——阅读源代码篇(转)
正如那本<Code Reading>一书中指出的那样,源代码阅读一直没有被很好的重 视:你上大学的时候有“代码阅读”这门课吗?相信没有. 1 Source Insight 谈到阅读源代码, ...
- MySQL分支Percona, cmake编译安装
Percona是在MySQL基础上改进的,在功能和性能上有着很显著的提升.该版本提升了在高负载情况下的InnoDB的性能,为DBA提供一些非常有用的性能诊断工具:另外有更多的参数和命令来控制服务器行为 ...
- Apache Spark Streaming的简介
Spark Streaming通过将流数据按指定时间片累积为RDD,然后将每个RDD进行批处理,进而实现大规模的流数据处理.其吞吐量能够超越现有主流流处理框架Storm,并提供丰富的API用于流数据计 ...
- hello, angular
开始系统学习一下angular!首先是hello world.根据官网给出的例子,我们一下做出下面这个东西: <!DOCTYPE html> <html ng-app> < ...
- HDU 4902 Nice boat (线段树)
Nice boat 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4902 Description There is an old country a ...
- Chrome的Postman的使用
Chrome提供了一个很好的Web App 名为 Postman 使用这个web app,你可以输入一个url,然后可以很清楚的看到返回的各种结果 直接在Google中输入Postman, 找到它 ...
- MSXML读取XML中文
// QueryNodes.cpp : Defines the entry point for the console application. // #include <stdio.h> ...
- HDU 2045 不容易系列之(3)—— LELE的RPG难题 (递推)
题意:略. 析:首先是假设前n-2个已经放好了,那么放第 n 个时,先考虑一下第 n-1 放的是什么,那么有两种情况. 如果n-1放的是和第1个一样的,那么第 n 个就可以在n-2的基础上放2个,也就 ...
- [IoC容器Unity] :Unity预览
1.引言 高内聚,低耦合成为一个OO架构设计的一个参考标准.高内聚是一个模块或者一个类中成员跟这个模块或者类的关系尽量高,低耦合是不同模块或者不同类之间关系尽量简单. 拿咱国家举例来说,假如你是中国人 ...