Yarn qt arraylist junit eking文件 combobox ant get odbc cocos2d html5 品优购电商系统开发 mac虚拟打印机 matlab跳出for循环 js数组截取前5个 axure导出html文件 cmd清空命令 mysqlinsert python3基础教程 python安装mysql python中文 python开发 python实战 python链接mysql数据库 python中set的用法 python环境变量配置 java中的对象 java获取月份 java中continue java开发语言 tar文件怎么打开 decimalformat 计算机网络自顶向下 js图片上传 millenium extjs视频教程 微信骰子表情包 winsxs可以删除吗 倒计时定时器 套料软件 cad圆变成多边形
当前位置: 首页 > 学习教程  > 编程语言

8.6 反射

2020/8/11 19:56:59 文章标签:

反射:框架设计的灵魂

	*框架:指半成品软甲。可以在框架的基础上进行软件开发,简化编码。
	   使用框架是不需要使用反射。
	*反射:是指在程序运行期间,能够观察和修改类或者类的对象的属性和行为的特性
		*好处:
			1、可以在程序运行过程中,操作这些对象。
			2、可以解耦,提高程序的可扩展性。
	*获取Class对象的方式:
		1、Class.foriName("全类名"):将字节码文件加载进内存,返回Class对象
			*多用于配置文件,将类名定义在配置文件中。读取文件,加载类
		2、类名.class:通过类名的属性class获取
			*多用于参数的传递
		3、对象.getClass():getClass()方法在Object类中定义这。
			*多用于对象的获取字节码的方式
		*结论:
			同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个
	*Class对象功能:
		*获取功能:
			1、获取成员变量们
				*Field[] getFields() :获取所有public修饰的成员变量的
				*Field getField(String name) 获取指定名称的public修饰的成员变量的

				*Field[] getDeclaredFields()
				*Field getDeclaredField(String name)
			2、获取构造方法们
				*Constructor<?>[] getConstructors()  
				*Constructor<T> getConstructor(Class<?>... parameterTypes)  
				
				*Constructor<?>[] getDeclaredConstructors()  
				*Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)  
			3、获取成员方法们
				*Method[] getMethods()  
				*Method getMethod(String name, Class<?>... parameterTypes)  
				
				*Method[] getDeclaredMethods()  
				*Method getDeclaredMethod(String name, Class<?>... parameterTypes)  
			4、获取类名
				*String getName()  
		*Java反射机制提供了以下的功能
			1、在运行时获取类的修饰符,包名,类名,实现的接口,继承的父类
			2、在运行时获取类的所有属性名,修饰符,属性类型
			3、在运行时获取所有方法,方法的返回值类型,方法名,方法参数数量,方法参数类型
			4、在运行时调用加载类的方法

项目实例

Student类:

package cn.kgc.kb09;

/**
 * @Author Daniu_Ben
 * @Date 2020/8/6
 * @Description
 */
public class Student {
    public int stuId;
    private String stuName;
    String gender;

    private Student() {
    }

    private Student(int stuId, String stuName, String gender) {
        this.stuId = stuId;
        this.stuName = stuName;
        this.gender = gender;
    }

    private int getStuId() {
        return stuId;
    }

    private void setStuId(int stuId) {
        this.stuId = stuId;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Student{" +
                "stuId=" + stuId +
                ", stuName='" + stuName + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}

Teacher类:

package cn.kgc.kb09;

/**
 * @Author Daniu_Ben
 * @Date 2020/8/6
 * @Description 单例模式:一个系统中,只允许存在该类的一个对象
 */
public class Teacher {

    private static Teacher t = null;
    private Teacher(){
        //不允许随意创建对象
    }
    /*//懒汉式
    public synchronized static Teacher getInstance(){
        if (t == null){
            t = new Teacher();
        }
        return t;
    }*/

    //饿汉式
    static{
        t = new Teacher();
    }
    public static Teacher getInstance(){
        return t;
    }
}

TestStudent类:

package cn.kgc.kb09;

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

/**
 * @Author Daniu_Ben
 * @Date 2020/8/6
 * @Description
 */
public class TestStudent<T> {
    public static void main(String[] args) throws Exception {
//        TestStudent s = new TestStudent();
//        //获取类对象的另一种方法
//        Class<? extends TestStudent> sC = s.getClass();

//        Student s = new Student();
        //1、获取类对象
//        Class<Student> stu = Student.class;//第一中方式
//        Class<?> stu = Class.forName("cn.kgc.kb09.Student");
        //2、获取构造方法
//        Constructor<Student> con = (Constructor<Student>) stu.getDeclaredConstructor();
//        con.setAccessible(true);
        //3、通过构造方法创建对象
//        Student student = con.newInstance();
        TestStudent ts = new TestStudent();
        Student student = (Student) ts.getObject(Class.forName("cn.kgc.kb09.Student"));

//        Student student = getStudent();
//        student.stuId = 1;
//        student.gender = "男";
//        student.setStuName("王思聪");
//        System.out.println(student);
    }
    public T getObject(Class<T> tClass){
        T t = null;
        try {
//            Class<T> tClass = (Class<T>) Class.forName(classPath);

            Constructor<T> ct = tClass.getDeclaredConstructor();
            ct.setAccessible(true);
            t = ct.newInstance();

//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return t;

    }
    public static Student getStudent(){
        Class<Student> s = Student.class;
        Student stu = null;
        try {
            Constructor<Student> c = s.getDeclaredConstructor();
            c.setAccessible(true);
            stu = c.newInstance();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return stu;
    }
}

TestConstructor类:

package cn.kgc.kb09;

import java.lang.reflect.Constructor;

/**
 * @Author Daniu_Ben
 * @Date 2020/8/6
 * @Description
 */
public class TestConstructor {
    public static void main(String[] args) throws Exception{
        Class<Student> c = Student.class;
        Constructor<Student> sClass = c.getDeclaredConstructor(int.class, String.class, String.class);
        sClass.setAccessible(true);
        Student s = sClass.newInstance(2,"马爸爸","神");
        System.out.println(s);
    }
}

TestField类:

package cn.kgc.kb09;

import java.lang.reflect.Field;

/**
 * @Author Daniu_Ben
 * @Date 2020/8/6
 * @Description 反射获取属性
 */
public class TestField {
    public static void main(String[] args) throws Exception{
        Student s = TestStudent.getStudent();
        Class<Student> c = Student.class;
        Field stuId = c.getField("stuId");
        stuId.set(s,11);
        Field stuName = c.getDeclaredField("stuName");
        stuName.setAccessible(true);
        stuName.set(s,"泡腾片");
        Field[] fields = c.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            System.out.println(field.get(s));
        }
        System.out.println(s);
    }
}

TestMethod类:

package cn.kgc.kb09;

import java.lang.reflect.Method;

/**
 * @Author Daniu_Ben
 * @Date 2020/8/6
 * @Description
 */
public class TestMethod {
    public static void main(String[] args) throws Exception{
        Student s = TestStudent.getStudent();
        Class<Student> c = Student.class;
        Method setStuId = c.getDeclaredMethod("setStuId", int.class);
        Method getStuId = c.getDeclaredMethod("getStuId");
        getStuId.setAccessible(true);
        setStuId.setAccessible(true);
//        Class<?> rt = getStuId.getReturnType();
//        System.out.println(rt);
        setStuId.invoke(s,3);
        Object stuId = getStuId.invoke(s);
        System.out.println(stuId);
        System.out.println(s);
    }
}


本文链接: http://www.dtmao.cc/news_show_100266.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?