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类
p
Java
基本数据类型(
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(String name,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());
}![](https://img-blog.csdn.net/20141111201147731?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF2YV96aGFveWFubGk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
//获取指定的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("学习");
}
}