反射

来源:互联网 发布:苹果mac顿号怎么打 编辑:程序博客网 时间:2024/06/05 06:37

1,列举常见jsp动作元素:

forward,   include,     param,    plugin,     getProparty,

2,反射

1)一个类有多个组成部分,例如:成员变量,方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分

2),Java反射所需要的类并不多,主要有java.lang.Class类和java.lang.reflect包中的FieldConstructorMethodArray类。
注意:Class类是Java反射的起源,针对任何一个你想探勘的类,只有先为它产生一个Class类的对象,接下来才能通过Class对象获取其他想要的信息

3.class类

pJava基本数据类型(booleanbytecharshortintlongfloatdouble);
p关键字void也都对应一个 Class 对象;
p每个数组属性也被映射为 Class 对象,所有具有相同类型和维数的数组都共享该Class 对象

因此,运行中的类或接口在JVM中都会有一个对应的Class对象存在,它保存了对应类或接口的类型信息。要想获取类或接口的相应信息,需要先获取这个Class对象。

4,加载类

¨Java中有一个Class类用于代表某一个类的字节码。
¨Class类即然代表某个类的字节码,它当然就要提供加载某个类字节码的方法:forName()forName方法用于加载某个类的字节码到内存中,并使用class对象进行封装
¨另外两种得到class对象的方式
p类名.class: Manager.class;  int.classdouble[].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) 

¨这些方法分别用于从类中解剖出构造函数、方法和成员变量(属性)。解剖出的成员分别使用ConstructorMethod 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("学习");
    }
    

}



0 0
原创粉丝点击