Java反射

来源:互联网 发布:气场强大的女生知乎 编辑:程序博客网 时间:2024/06/05 20:15

1、Java中的反射机制

这里写图片描述

2、Class对象

要想了解反射,首先得看Class
Class就是类的类型,比说字符串类型是String,整形类型就是Integer.
获取类的类型的三种方式:
首先建立Bean

package com.example.refelectTest;public class Book {    private int id;    private String name;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

测试代码如下

package com.example.refelectTest;/** 1.  2. 获取类对象的三种方式 1、通过Class.forName(包名全路径)获取类型 2、通过实例化对象获取 */public class Test {    public static void main(String[] args) {        Class c1 = null;        Class c2 = null;        Class c3 = null;        // 第一种方式        try {            c1 = Class.forName("com.example.refelectTest.Book");        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        System.out.println("第一种方式,通过包名获得" + c1);        // 第二种方式        Book b = new Book();        System.out.println("第二种方式,实例化获取" + b.getClass());        // 第三种方式        System.out.println("第三种方式,直接通过类名" + Book.class);    }}

运行结果:
这里写图片描述

3、Field对象

  1. 位于Java.lang.reflect.Field类,是用于表示类中、接口中属性对象的类,
  2. 可以操作类中私有,以及公有的全部属性和方法。

代码如下 :
Bean类:学生name,age为私有,id为公有;

package com.example.test;public class Student {    private String name;    private int age;    public String id;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}

测试代码:

package com.example.test;import java.awt.print.Book;import java.lang.reflect.Field;public class MyTest {    public static void main(String[] args) {        // TODO Auto-generated method stub        MyTest myTest = new MyTest();        myTest.show(Student.class);    }    // 传递过来的class对象获取类中的属性    public void show(Class cls) {        // getDeclaredFields可以得到全部(公有,私有的属性)        System.out.println("通过getDeclaredFields()方法-----------------");        Field[] f = cls.getDeclaredFields();        for (Field field : f) {            // 得到属性名称;            System.out.println(field.getName());            // 得到属性类型;            System.out.println(field.getType());        }        System.out.println("通过getFields()方法-----------------");        // getFields可以得到公有属性;        Field[] f1 = cls.getFields();        for (Field field : f1) {            // 得到属性名称;            System.out.println(field.getName());            // 得到属性类型;            System.out.println(field.getType());        }    }}

运行结果:
这里写图片描述

4、Method对象

  1. 位于java.lang.reflect.Method类中用于表示类中,接口中方法对象的类。
  2. 能够操作类中私有和公有的方法。

    测试代码:

package com.example.test1.method;import java.lang.reflect.Method;import java.lang.reflect.Modifier;import com.example.bean.Book;/** * Method类中用于表示类中,接口中方法对象的类。 * 能够操作类中私有和公有的方法。 * @author yu * */public class MethodTest {    public static void main(String[] args) {        // TODO Auto-generated method stub         Book b =new Book();         MethodTest methodTest=new MethodTest();         methodTest.show(b);    }    public void show(Object o) {        Class cl = o.getClass();        Method[] method = cl.getDeclaredMethods();        for (Method m : method) {            //得到所有的方法名称;            System.out.println("方法名称-------"+m.getName());            System.out.println("方法修饰符------"+Modifier.toString(m.getModifiers()));            System.out.println("方法返回值类型---"+m.getReturnType());        }    }}

运行结果:
这里写图片描述

2 0
原创粉丝点击