反射

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());
                }
                
                //获取指定的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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值