反射
来源:互联网 发布:苹果mac顿号怎么打 编辑:程序博客网 时间:2024/06/05 06:37
1,列举常见jsp动作元素:
forward, include, param, plugin, getProparty,
2,反射
1)一个类有多个组成部分,例如:成员变量,方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分
2),Java反射所需要的类并不多,主要有java.lang.Class类和java.lang.reflect包中的Field、Constructor、Method、Array类。
注意:Class类是Java反射的起源,针对任何一个你想探勘的类,只有先为它产生一个Class类的对象,接下来才能通过Class对象获取其他想要的信息3.class类
pJava基本数据类型(boolean、byte、char、short、int、long、float和 double);
p关键字void也都对应一个 Class 对象;
p每个数组属性也被映射为 Class 对象,所有具有相同类型和维数的数组都共享该Class 对象
因此,运行中的类或接口在JVM中都会有一个对应的Class对象存在,它保存了对应类或接口的类型信息。要想获取类或接口的相应信息,需要先获取这个Class对象。
4,加载类¨Java中有一个Class类用于代表某一个类的字节码。
¨Class类即然代表某个类的字节码,它当然就要提供加载某个类字节码的方法:forName()。forName方法用于加载某个类的字节码到内存中,并使用class对象进行封装
¨另外两种得到class对象的方式
p类名.class: Manager.class; int.class; double[].class;
p对象.getClass()
5,解剖类¨Class对象提供了如下常用方法:
Public Constructor getConstructor(Class<?>... parameterTypes)
Public Method getMethod(String name,Class<?>... parameterTypes)
Public Field getField(String name) public
publicConstructor getDeclaredConstructor(Class...parameterTypes)
publicMethod getDeclaredMethod(Stringname,Class... parameterTypes)
publicField getDeclaredField(String name)
¨这些方法分别用于从类中解剖出构造函数、方法和成员变量(属性)。解剖出的成员分别使用Constructor、Method 、 Field 对象表示。
¨6,相应的案例,说明反射就是解析出 构造函数 构造方法 成员变量
(1.Test.Java)
package www.csdn.net.blank.domain;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import www.csdn.blank.domain.User;
public class Test {
//java虚拟机会为每个类分配唯一的java对象
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchFieldException, SecurityException {
//方式1.获取class对象
//Class clazz = new User().getClass();
//方式2.获取class对象
//clazz = User.class;
//方式3.获取class对象 方式1、2、3任何一种都可以
Class clazz = Class.forName("www.csdn.net.blank.domain.User");
//jvm new User
//实例化对象()
User u = (User)clazz.newInstance();
//是把 User.class类中的 方法 属性 构造构造函数都解析出来
//解析出这个类中的构造函数
Constructor<User>[] constructors= clazz.getConstructors();
System.out.println("-----------------");
//遍历构造函数
for(Constructor<User> c:constructors){
System.out.println(c.getName()+","+c.getModifiers());
//获取构造函数参数的类型,?代表不知道的意思
Class<?>[] cx= c.getParameterTypes();
//遍历构造函数参数类型
for(Class cl:cx){
//获取参数类型的名称
System.out.println(cl.getName());
}
}
System.out.println("-----------解析出的方法-----------------------");
//解析出方法
Method methods[] = clazz.getMethods();
//遍历方法
for(Method method:methods){
//输出方法的名称
System.out.println(method.getName()+",");
/解析得到方法的参数类型
Class<?>[] cx= method.getParameterTypes();//按照声明顺序返回class对象的数组,这些对象描述了此method对象所表示的方法的参数类型。
//遍历参数类型
for(Class cl:cx){
//获取参数类型的名称
System.out.println(cl.getName());
}
}
System.out.println("---------解析出成员变量------------");
//获取所有的字段
Field[] fields = clazz.getFields();//返回字段
//遍历
for(Field f:fields){
//获取字段的名称
System.out.println(f.getName());//get 。。。返回对象上此Field表示的字段
//获取字段的类型名称
System.out.println(f.getType().getName());
}
//获取指定的field字段
Field field = clazz.getField("age");
//给指定的u对象的age字段赋值
field.set(u, 18);
//输出
System.out.println("赋值的结果::::"+u.getAge());
}
}
(2.Uesr.java)
package www.csdn.blank.domain;
import java.util.Date;
public class User {
private String name;
private String age;
public User() {
super();
// TODO Auto-generated constructor stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge(){
return age;
}
public void setAge(String age) {
this.age = age;
}
public void study(String sex,String xx,Date date){
System.out.println("学习");
}
}
(1.Test.Java)
package www.csdn.net.blank.domain;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import www.csdn.blank.domain.User;
public class Test {
//java虚拟机会为每个类分配唯一的java对象
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchFieldException, SecurityException {
//方式1.获取class对象
//Class clazz = new User().getClass();
//方式2.获取class对象
//clazz = User.class;
//方式3.获取class对象 方式1、2、3任何一种都可以
Class clazz = Class.forName("www.csdn.net.blank.domain.User");
//jvm new User
//实例化对象()
User u = (User)clazz.newInstance();
//是把 User.class类中的 方法 属性 构造构造函数都解析出来
//解析出这个类中的构造函数
Constructor<User>[] constructors= clazz.getConstructors();
System.out.println("-----------------");
//遍历构造函数
for(Constructor<User> c:constructors){
System.out.println(c.getName()+","+c.getModifiers());
//获取构造函数参数的类型,?代表不知道的意思
Class<?>[] cx= c.getParameterTypes();
//遍历构造函数参数类型
for(Class cl:cx){
//获取参数类型的名称
System.out.println(cl.getName());
}
}
System.out.println("-----------解析出的方法-----------------------");
//解析出方法
Method methods[] = clazz.getMethods();
//遍历方法
for(Method method:methods){
//输出方法的名称
System.out.println(method.getName()+",");
/解析得到方法的参数类型
Class<?>[] cx= method.getParameterTypes();//按照声明顺序返回class对象的数组,这些对象描述了此method对象所表示的方法的参数类型。
//遍历参数类型
for(Class cl:cx){
//获取参数类型的名称
System.out.println(cl.getName());
}
}
System.out.println("---------解析出成员变量------------");
//获取所有的字段
Field[] fields = clazz.getFields();//返回字段
//遍历
for(Field f:fields){
//获取字段的名称
System.out.println(f.getName());//get 。。。返回对象上此Field表示的字段
//获取字段的类型名称
System.out.println(f.getType().getName());
}
//获取指定的field字段
Field field = clazz.getField("age");
//给指定的u对象的age字段赋值
field.set(u, 18);
//输出
System.out.println("赋值的结果::::"+u.getAge());
}
}
(2.Uesr.java)
package www.csdn.blank.domain;
import java.util.Date;
public class User {
private String name;
private String age;
public User() {
super();
// TODO Auto-generated constructor stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge(){
return age;
}
public void setAge(String age) {
this.age = age;
}
public void study(String sex,String xx,Date date){
System.out.println("学习");
}
}
0 0
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- Unity3D的多点触摸
- 在Debian Linux上快速安装LAMP环境
- 使用Apache Commons Net包中的FTPClient实现javaFTP来上传目录
- 新的开始,对世界Say Hello
- android发送短信代码(短信内容超长处理)
- 反射
- 用happen-before规则重新审视DCL
- 查询看TCP连接状况
- 整理:Google文件系统
- 《精通Linux设备驱动程序开发》——输入设备驱动程序
- Eclipse引入源码包时,中文出现乱码的解决方案
- NGUI之自适应
- DirectUI duilib介绍
- C#多线程编程