JAVA动态性之一一反射机制reflection
package com.bjsxt.reflection.test.bean;
public class User {
private int id;
private int age;
private String uname;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public User(int id, int age, String uname) {
super();
this.id = id;
this.age = age;
this.uname = uname;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
}
package com.bjsxt.reflection.test;
/**
*
* 测试各种类型(class,interface,enum,annotation,primitive type,void)java。lang。Class对象获取方式
* @author Administrator
*
*/
@SuppressWarnings("all")
public class Demo01 {
public static void main(String[] args) {
String path = "com.bjsxt.reflection.test.bean.User";
try {
Class clazz = Class.forName(path);
// 一个类被加载后 JVM就会创建一个该类的Class对象。类的结构信息会放大对应的Class对象中 System.out.println(clazz.hashCode()); Class clazz2 = Class.forName(path);
System.out.println(clazz2.hashCode());//同一个类只有一个反射对象 Class strClazz = String.class;
Class strClazz2 = path.getClass();
System.out.println(strClazz == strClazz2); Class intClazz = int.class;
//数组 同样的数据类 比较是不是同一个维度 不同 则不同
int[]arr01 = new int[];
int[]arr02 = new int[];
//2维数组
int[][]arr03 = new int [][];
System.out.println(arr01.getClass().hashCode());
System.out.println(arr02.getClass().hashCode());
System.out.println(arr03.getClass().hashCode()); double[]arr04 = new double[];
System.out.println(arr04.getClass().hashCode());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
true
以上是如何获取
各种类型(class,interface,enum,annotation,primitive type,void)java。lang。Class对象获取方式
获取到对象后,下面利用反射里面的Api
java.lang.reflect
做些事情
应用反射的API 获取类的信息(包的名字 类的名字 属性 方法 构造方法等)
package com.bjsxt.reflection.test; import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method; /**
* 应用反射的API 获取类的信息(类的名字 属性 方法 构造方法等)
* @author Administrator
*
*/
public class Demo02 {
public static void main(String[] args) {
String path = "com.bjsxt.reflection.test.bean.User";
try {
Class clazz = Class.forName(path); //获取包名+类名
System.out.println(clazz.getName());
// 获得类名 User
System.out.println(clazz.getSimpleName());
//获取属性信息
//引入import java.lang.reflect.Field;
Field[] fields = clazz.getFields();//返回所有属性 public的属性 如何是别的 获取不到
System.out.println(fields.length);//
Field[] fields1 = clazz.getDeclaredFields();//获得所有的属性 不管你的访问修饰符是什么
System.out.println(fields.length);//
for(Field temp:fields){
System.out.println("属性"+temp);
}
// Field f1 = clazz.getDeclaredField("id");
// Field f2 = clazz.getDeclaredField("age");
// Field f3 = clazz.getDeclaredField("uname"); //获得 方法信息
Method[] method = clazz.getDeclaredMethods();
Method m =clazz.getDeclaredMethod("getUname", null);
Method m2 = clazz.getDeclaredMethod("setUname", String.class);
//获得构造放方法的信息
Constructor[]constructors = clazz.getDeclaredConstructors();// 获得所有构造器
Constructor c= clazz.getDeclaredConstructor(null);// 获得无参构造器
Constructor c1= clazz.getDeclaredConstructor(int.class,int.class,String.class);
//获得参数列表类型是int int String 方法的构造器 } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }
动态调用 获取到的 类的信息 (属性 方法 构造器)
package com.bjsxt.reflection.test; import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import com.bjsxt.reflection.test.bean.User; public class Demo03 {
public static void main(String[] args) {
String path = "com.bjsxt.reflection.test.bean.User";
try {
Class<User> clazz = (Class<User>)Class.forName(path);
// 通过反射api调用构造方法 构造对象
User u = clazz.newInstance(); //调用了 User的无参构造方法
System.out.println(u);
//调用有参构造器
Constructor<User>c = clazz.getDeclaredConstructor(int.class,int.class,String.class);
User u2 = c.newInstance(,,"王二");
System.out.println(u2.getUname()); //通过反射api调用普通方法
User u3 = clazz.newInstance();
Method method =clazz.getDeclaredMethod("setUname", String.class);
method.invoke(u3, "张三");//25 26 行代码 相等于 u3.setUname("张三"); System.out.println(u3.getUname()); // 通过反射api调用属性
User u4 = clazz.newInstance();
Field f = clazz.getDeclaredField("uname");
f.setAccessible(true);//这个属性不用做安全检查了 可以直接访问 否则会报错 说不能访问私有属性
f.set(u4, "李四");//通过反射直接写属性的值
System.out.println(u4.getUname());//通过反射直接读属性的值
System.out.println(f.get(u4));//通过反射读属性 } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
反射机制的性能问题
使用setAccessible提高性能(setAccessible是启用/禁用访问安全的开关)
f.setAccessible(true);// 禁用安全检查 这个属性不用做安全检查了 可以直接访问 否则会报错 说不能访问私有属性
效率提高4倍
反射操作注解(annotation)
反正操作泛型(Generic)
- ParameterizedType:表示一种参数化的类型,比如Collection< String >
- GenericArrayType:表示一种元素类型是参数化类型或者类型变量的数组类型
- TypeVariable:是各种类型变量的公共父接口
WildcardType:代表一种通配符类型表达式,比如?、? extends Number、? super Integer。(wildcard是一个单词:就是”通配符“)
package com.bjsxt.reflection.test; import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map; import com.bjsxt.reflection.test.bean.User; public class Demo04 {
//参数类型有泛型
public void test01(Map<String,User>map,List<User>list){
System.out.println("Demo04.test01()");
}
// 无参 但是有返回值类型 泛型
public Map<Integer,User> test02(){
System.out.println("Demo04.test02()");
return null;
}
//通过程序读取到 参数的泛型 和 返回值的泛型
public static void main(String[] args) {
try {
//Demo04.class获得Demo04这个类的一个对象
//Demo04.class.getMethod("test01",Map.class,List.class);获得这个类的test01方法Method m这个对象
Method m = Demo04.class.getMethod("test01",Map.class,List.class);
// m.getGenericParameterTypes();获得带泛型参数类型
Type[]t = m.getGenericParameterTypes();
for(Type paramType:t){
System.out.println("#"+paramType);
//判断是否参数类型是带有泛型
if(paramType instanceof ParameterizedType ){
//强制转换成带泛型的参数类型((ParameterizedType) paramType)
//.getActualTypeArguments();获得真正的带泛型参数类型
Type[]gernericTypes=((ParameterizedType) paramType).getActualTypeArguments();
for(Type genericType:gernericTypes){
System.out.println("泛型类型"+genericType); }
}
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
#java.util.Map<java.lang.String, com.bjsxt.reflection.test.bean.User>
泛型类型class java.lang.String
泛型类型class com.bjsxt.reflection.test.bean.User
#java.util.List<com.bjsxt.reflection.test.bean.User>
泛型类型class com.bjsxt.reflection.test.bean.User
JAVA动态性之一一反射机制reflection的更多相关文章
- Java - 反射机制(Reflection)
Java - 反射机制(Reflection) > Reflection 是被视为 动态语言的关键,反射机制允许程序在执行期借助于 Reflection API 取得任何类的 ...
- Java 核心类库之反射机制
1:什么是反射机制? 2:反射机制它可以做什么呢? 3:反射机制对应的API又是什么? 1):通过反射机制来获取一个对象的全限定名称(完整包名),和类名: 2):实例化Class对象 3):获取对象的 ...
- java反射机制--reflection
反射,reflection,听其名就像照镜子一样,可以看见自己也可以看见别人的每一部分.在java语言中这是一个很重要的特性.下面是来自sun公司官网关于反射的介绍: Reflection is ...
- Java反射机制Reflection
Java反射机制 1 .class文件 2 Class类 3 Class类与反射机制 4 Java反射机制的类库支持及简介 5 反射机制的定义与应用 6 反射机制Demo Java反射机制demo(一 ...
- Java中的反射机制Reflection
目录 什么是反射? 获取.class字节码文件对象 获取该.class字节码文件对象的详细信息 通过反射机制执行函数 反射链 反射机制是java的一个非常重要的机制,一些著名的应用框架都使用了此机制, ...
- java.lang.Class<T> -- 反射机制
1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...
- 在JAVA中,关于反射机制的讨论
一.什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 ...
- java工厂类与反射机制
java 简单工厂类 2012-04-22 15:44:07| 分类: java | 标签:java工厂类 简单工厂类 |举报|字号 订阅 简单工厂模式需要由以下角色组成: 接口 ...
- Java SE之初探反射机制
[Keywords]:Java,Hibernate,虚拟机,框架,SQL [Abstract]: 反射的概念:所谓的反射就是java语言在运行时拥有一项自观的能力,反射使您的程序代码能够得到装载到 ...
随机推荐
- Ushare共享流媒体
一. 支持USB 参考: http://wenku.baidu.com/link?url=K_uAp4QEa2cX3nPMkbc-colCAHA1yBwo1JCYsZf-qR7AVFPkmpbBVYR ...
- DOM操作之属性和样式操作
在DOM操作,除了前面的节点操作以外,常常被用到的操作还有属性操作和节点操作,下面,主要来总结一下jQuery中的属性操作方法和样式操作方法. 在开始操作前,我们需要先在html中添加如下代码,后面所 ...
- C++ namespace命名空间
1.什么是命名空间 简而言之:划片取名 加入有两个公司,公司A里面有一个员工小明,公司B里面有一个员工小明,两个公司在同一栋楼.这时,你去找小明,你再楼下大喊:“小明!你给我下来!”,这时两个小明都会 ...
- python 可视化 散点图。柱状图、等高线
matplolib.org可查到更多画图方法等 散点图 import matplotlib.pyplot as plt import numpy as np #n个点 n = 1024 #平均值是0, ...
- HTML5: SVG (可缩放矢量图形)
ylbtech-HTML5: SVG (可缩放矢量图形) 可缩放矢量图形是基于可扩展标记语言(标准通用标记语言的子集),用于描述二维矢量图形的一种图形格式.它由万维网联盟制定,是一个开放标准. 1. ...
- 接口测试maven管理
接口测试框架选择 界面化工具,针对不会编码的测试人员: 1.Jmeter性能测试工具,不具备完备的接口测试框架功能 2.Robotframerwork 3.PostMan 推荐框架: ResrAssu ...
- ESXI5.5设置主机的时间自动同步服务 NTP
背景:现在公司的很多线上服务也都通过虚拟化来实现,最近遇到一个小问题,虚拟机上的时间不准确.原来是虚拟机会主动同步宿主机时间,一般虚拟机中都安装vmware tool工具,这个工具会自动和宿主机进行时 ...
- web项目除了业务还需要关注的点
1:安全性,不允许访问外网,访问外网通过反向代理的方式. 2:安全性,和外网交互的时候,需要CA证书,基于SSL协议的证书 3:日志,生产上通常会关闭某些日志,所以,允许出现的日志就显得至关重要了. ...
- jQuery动态的给页面中添加一条样式表的链接
HTML部分: <input type="button" value="单击" onclick="getbody()" /> & ...
- direct path read/write (直接路径读/写)
转载:http://www.dbtan.com/2010/04/direct-path-readwrite.html direct path read/write (直接路径读/写): 直接路径读(d ...