JDK5.0新特性-反射

反射:
什么是反射?
剖析Java类中的各个组成部分映射成一个个java对象
为什么用反射?
多用于框架和组件,写出复用性高的通用程序

1.Class类.
Class代表的就是我们的字节码文件.
三种方式.
1.类名.class
2.对象.getClass();
3.Class.forName();

在开发中创建使用第三种 Class.forName();为什么?
这种方式耦合度低,没有依赖性.

------------------------------------------
2.Constructor(构造器对象)
构造器的作用就是用来创建对象的。
Constructor代表的是构造器对象,我们得到它后就可以实例化对象.

1.怎样得到Constructor对象.
getConstructor()-----得到指定的构造器
getConstructors();---得到所有的构造器

2.关于Constructor的注意事项
1.如果构造方法不是public。那么要获取其构造器对象使用 getDeclaredConstuctor()方法.

2.对于私有化权限,在使用前必须设置权限检查.
public void setAccessible(boolean flag)
值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查

3.在开发中,我们在得到Class时,一般会直接实例化类的对象.

2.Field

3.Method

1.

2.对于static方法怎样调用?
静态方法调用时不需要使用对象,直接写null
staticMethod.invoke(null,参数);
方法的参数如果是数组怎样调用?

在调用invoke时,第二个参数强制转换成Object,或在外面在包装一层数组.

1

package cn.itcast.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

import org.junit.Test;

public class Demo1 {

    @Test
    public void demo1() throws ClassNotFoundException, InstantiationException,
            IllegalAccessException {
        Class clazz = Class.forName("cn.itcast.reflect.Teacher");
        clazz.newInstance();

        Teacher t = new Teacher();
    }

    // 获取Class对象
    @Test
    public void demo2() throws ClassNotFoundException {

        // 1.通过.class
        // Class clazz=Teacher.class;

        // 2.通过对象获取
        // Teacher t = new Teacher();
        // Class clazz = t.getClass(); //getClass方法是在Object类中定义的

        // 3.Class.forName()

        Class clazz = Class.forName("cn.itcast.reflect.Teacher");

    }

    // 获取构造器.
    @Test
    public void demo3() throws SecurityException, NoSuchMethodException,
            IllegalArgumentException, InstantiationException,
            IllegalAccessException, InvocationTargetException {

        // 1.得到Teacher类的Class对象.
        Class clazz = Teacher.class;

        // 2.得到Teacher类的构造器.
        Constructor c1 = clazz.getConstructor(); // 无参数构造
        Constructor c2 = clazz.getConstructor(String.class); // String类型参数构造
        Constructor c3 = clazz.getConstructor(String.class, int.class); // String,int类型参数构造

        // 3.通过Constructor对象创建Teacher类的实例.
        // Teacher obj1 = (Teacher) c1.newInstance(); // 相当于new Teacher();
        //
        // obj1.show();

        // Teacher obj2 = (Teacher) c2.newInstance("张三");// new Teacher("张三");
        //
        // obj2.show();

        Teacher obj3 = (Teacher) c3.newInstance("李四", 20);// new
                                                            // Teacher("李四",20);

        obj3.show();

    }

    // 关于Constructor的注意事项
    @Test
    public void demo4() throws SecurityException, NoSuchMethodException,
            IllegalArgumentException, InstantiationException,
            IllegalAccessException, InvocationTargetException {
        // 1.得到Teacher类的Class对象.
        Class clazz = Teacher.class;
        // 2.获取非public的构造器对象.
        Constructor c = clazz.getDeclaredConstructor(String.class, int.class);

        // 取消安全检查
        c.setAccessible(true);

        // 3.创建Teacher对象
        Teacher obj = (Teacher) c.newInstance("李四", 20);

        obj.show();

    }

    @Test
    public void demo5() throws InstantiationException, IllegalAccessException {
        Class clazz = Teacher.class;

        Teacher t = (Teacher) clazz.newInstance();// 要求必须存在无参构造
    }

    // 关于Field类.---它代表的是属性.
    @Test
    public void demo6() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, InstantiationException {
        // Field对象的获取也是通过Class
        Class clazz = Teacher.class;
        Field fname = clazz.getDeclaredField("name"); //相当于得到了String name属性.

        fname.setAccessible(true);

        //得到属性值.
        Teacher t=(Teacher) clazz.newInstance();
        //Object msg=fname.get(t); //相当于   t.name;

        //对属性值进行赋值操作.

        fname.set(t, "abcdef"); //t.name="abcdef";

        System.out.println(t.getName());
    }
}

2

package cn.itcast.reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.Test;

//Method操作
public class Demo2 {

    // 得到Teacher类中的show方法的Metho对象.
    @Test
    public void fun1() throws SecurityException, NoSuchMethodException,
            IllegalArgumentException, IllegalAccessException,
            InvocationTargetException, InstantiationException {
        // 1.得到Class
        Class c = Teacher.class;

        // 2.得到Method
        // Method m1 = c.getMethod("show"); // 获取show();

        Method m2 = c.getMethod("show", String.class);

        // 3.让方法执行.
        Teacher t = (Teacher) c.newInstance(); // Teacher t=new Teacher();
        // m1.invoke(t); //相当于 t.show();

        m2.invoke(t, "good");

    }

    @Test
    public void fun2() throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {
        // 1.得到Class
        Class c = Teacher.class;

        // 2.得到Method
        Method m=c.getMethod("show", String.class, int.class);

        //3.让方法执行.
        Object returnValue=m.invoke(c.newInstance(), "tom",20); //String msg=t.show("tom",20);

        System.out.println(returnValue);

    }
}

3

package cn.itcast.reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.Test;

public class Demo3 {

    public static void main(String[] args) {

        // 要通过反射去调用main方法.并传递参数.

        System.out.println(args[0]);

        System.out.println(args[1]);

    }

    @Test
    public void fun() throws SecurityException, NoSuchMethodException,
            IllegalArgumentException, IllegalAccessException,
            InvocationTargetException {
        // 1.得到当前类的Class

        Class clazz = Demo3.class;
        // 2.得到这个类中的main方法的Method

        Method main = clazz.getMethod("main", String[].class);

        // 3.调用main方法. invoke。

        //main.invoke(null, new String[]{"hello", "world"}); // 参数个数错误

        main.invoke(null,new Object[]{new String[]{"hello", "world"}});

        main.invoke(null, (Object)(new String[]{"hello", "world"}));
    }
}

4

package cn.itcast.reflect;

public class Teacher {
    public int age = 10;
    private String name = "tom";

    public Teacher() {
        System.out.println("Teacher无参构造方法");
    }

    public Teacher(String name) {
        this.name = name;
        System.out.println("Teacher构造方法----String name");
    }

    private Teacher(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("Teacher构造方法----String name,int age");
    }

    public String getName() {
        return name;
    }

    public void show() {
        System.out.println("name:" + name + "  age:" + age);
    }

    public void show(String msg) {
        System.out.println(msg);
    }

    public String show(String msg,int i){
        return msg+"   "+i;
    }

}
时间: 2024-10-26 12:25:08

JDK5.0新特性-反射的相关文章

Day07 jdk5.0新特性&Junit&反射

day07总结 今日内容 MyEclipse安装与使用 JUnit使用 泛型 1.5新特性 自动装箱拆箱 增强for 静态导入 可变参数方法 枚举 反射 MyEclipse安装与使用(yes) 安装MyEclipse 先安装了JDK ? MyEclipse介绍 ? MyEclipse是Eclipse的一个插件: MyEclipse是需要花钱的: MyEclipse官网不在欢迎中国人登录: ? MyEclipse使用 ? 1 创建项目 选择工作空间: 工作空间路径不能有空格和中文: 工作空间以班名

day07 MyEclipse 安装 jdk5.0 新特性

1.myeclipse的安装和使用 * eclipse:是一个免费的开发工具    * myeclipse:是一个收费的插件,破解myeclipse,        ** 安装目录的要求: 不能有中文和空格        ** 安装完成之后,选择一个工作空间 ,这个工作空间不能有中文和空格    * 破解myeclipse        ** 运行run.bat文件,但是运行之前,必须要安装jdk,通过配置环境变量 * myeclipse的使用        * 创建一个工程          

Java JDK5.0新特性

JDK5.0新特性 虽然JDK已经到了1.8 但是1.5(5.0)的变化是最大的 1. 增强for循环 foreach语句 foreach简化了迭代器 作用: 对存储对象的容器进行迭代 (数组, collection, map) 1> 格式 增强for循环括号里写两个参数 第一个是声明一个变量 第二个就是需要迭代的容器 for( 元素类型 变量名 : Collection集合 & 数组 ) { ... } 2> 增强for循环和传统for循环的区别 a. 增强for循环在使用时 必须要

JDK5.0新特性

JDK5中新增了很多新的java特性,利用这些新语法可以帮助开发人员编写出更加高效.清晰,安全的代码. 这些新特性主要有:1.静态导入2.自动装箱/拆箱3.增强for循环4.可变参数5.枚举6.泛型7.元数据 1.静态导入静态导入用于简化程序对静态属性和方法的调用 语法:Import static 包名.类名.静态属性|静态方法|*例如: import static java.lang.System.out import static java.lang.Math.* 2.自动装箱/拆箱自动装箱

JDK5.0新特性-泛型

泛型(重点) 什么是泛型? 对数据类型进行一个限定. 应用最多的地方是集合. 为什么要使用泛型? 1.提高我们程序安全性. 2.将运行阶段的问题在编译阶段解决. 3.不用进行类型强制转换 ----------------------------------------------- 我们学习泛型的目的:会使用集合上定义的泛型. 1.集合上泛型的基本使用. //Collection<E> //List<E> //Set<E> //它们的作用是限定集合中元素的类型. 我们可

JDK5.0新特性-自动装箱/拆箱

lJDK5.0的语法允许开发人员把一个基本数据类型直接赋给对应的包装类变量, 或者赋给 Object 类型的变量,这个过程称之为自动装箱. l自动拆箱与自动装箱与之相反,即把包装类对象直接赋给一个对应的基本类型变量. l典型应用: List list = new ArrayList(); list.add(1); int j = (Integer)list.get(0); package cn.itcast.autobox; import java.util.ArrayList; import

JDK5.0新特性-静态导入

静态导入(知道) 格式:import static 包名.类名.方法名(属性名); 在类中使用这个静态成员时可以不用类名.直接写方法名或属性名就可以. 静态导入缺点: 1.代码可读性下降. 2.由于方法名的重复,静态导入在一些特定的情况下会报错. --------------------------- package cn.itcast.staticdemo; import java.util.Arrays; import org.junit.Test; import static java.u

JDK5.0新特性-可变参数

可变参数: 格式 类型... 变量 本质上这个参数是一个数组. 优点:1.传参数时可以传递数组,也可以传递多个值. 2.可以不传递值. Arrays.asList()可以将数组转换成List集合. 注意:得到的是一个固定长度的List集合. 原因:是因为数组长度是固定的,这个集合是由数组转换成的. 为什么要将数组转换成集合? 集合中提供更丰富的操作. int[] arr = { 1, 2, 3 }; List list = Arrays.asList(arr); System.out.print

JDK5.0新特性-增强for循环

============== 增强for循环 它的底层实现就是使用Iterator. 什么样的容器可以使用增强for?-----------Iterable 增强for的缺点:只能进行遍历,不能进行在遍历过程中的操作. 增强for的格式 for(类型 引用:容器){ } -------------------------------------------- 关于对集合的遍历. List 1.Iterator 2.增强for 3.普通for 4.ListIterator Set 1.增强for