java反射机制的简单使用

java 反射机制

反射机制简介 参考地址

  1. 什么是反射机制 反射机制指程序在运行时能够获取自身的信息。在java中只要给定类的名字,就可以通过反射机制获得类的所有信息
  2. 反射机制的优缺点
    1. 首先了解一下动态和静态的概念
    2. 静态编译:在编译时确定类型,绑定对象,即通过
    3. 动态编译:运行时确定类型,绑定对象。
    4. 反射机制的优点: 可以实现动态创建对象和编译,体现出很大的灵活性
    5. 反射机制的缺点: 对性能是有影响的,使用反射基本上是一种解释操作,这种操作总是慢于只直接执行相同的操作。
  3. 利用反射机制能获得什么信息 利用反射机制可以获得类中的所有信息,不过前提是得知道类的对象

反射机制的一些相关的代码

获取运行时类的对象的几种方法

import java.lang.reflect.Constructor;
import java.util.Arrays;

import org.junit.Test;
/**
*定义一个Worker类来作为示例
*/
class Worker{
    String name;
    int age;
    int salary;
    Worker() {
        
    }
    
    Worker(String name, int age, int salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
    
    void show(){
        System.out.println("姓名" + name);
        System.out.println("年龄" + age);
    }
    
    public String toString() {
        return "Worker [name=" + name + ", age=" + age + ", salary=" + salary
                + "]";
    }
    
}


/**
*通过反射机制获取运行时类的对象的几种方法示例
*/
public class TestReflection {
    public static void main(String[] args) throws Exception {
//      1.通过对象调用getClass方法得到运行时类的对象
        Worker w1 = new Worker("Jhon", 20, 20000);
        Class<Worker> clazz1 = (Class<Worker>) w1.getClass(); 
        Worker w2 = (Worker)(clazz1.newInstance());
        w2.show();
        System.out.println(clazz1);
        
//      2.通过类来获取运行时类的对象
        Class clazz2 = Worker.class;
        System.out.println(clazz2);
        
//      3.通过Class.forName(String name)获得运行时类的对象
        Class clazz3 = Class.forName("Worker");                //注:如果worker类不在缺省包中,括号里面要以包名开头
        System.out.println(clazz3);
        
//      4.通过类的加载器来加载运行时类的对象
        Class clazz4 = ClassLoader.getSystemClassLoader().loadClass("Worker");   //注:如果worker类不在缺省包中,括号里面要以包名开头
        System.out.println(clazz4);
        
//      得到构造方法并调用对应对象的方法
        Constructor constructor1 = clazz4.getDeclaredConstructor();
        (clazz1.cast(constructor1.newInstance())).show();
        
        Constructor constructor2 = clazz1.getDeclaredConstructor(String.class, int.class, int.class);
        Object obj = constructor2.newInstance("Tom",20,20000);
        System.out.println(obj);
        
        Constructor[] constructors = clazz2.getDeclaredConstructors();
        System.out.println(Arrays.toString(constructors));
    }

}

java反射的通用代码

通过上面的代码可以获得 运行时类的对象,然后下面使用运行时类的对象来构造一个反射工具类,通过下面这个类 可以利用反射机制实例化该类的对象,设置对象的属性并调用对象的方法

import java.lang.reflect.Field;
import java.lang.reflect.Method;
//反射工具类
class ReflectionUtils{
    //通过运行时类得到相应的对象
    public static Object getObject(Class clazz) throws Exception{
        //调用对应类的空构造方法,所以传进来的类的对象对应的类一定得有空的构造方法
        return clazz.newInstance();
    }
    
    //设置对象属性
    public static void setField(Object obj,String name,Object value) throws Exception{
        Class clazz = obj.getClass();
        Field field = clazz.getDeclaredField(name);
        field.setAccessible(true);
        field.set(obj, value);
    } 
    
    //调用对象的方法
    public static void setMethod(Object obj,String name,Object...args) throws Exception{
        Class clazz = obj.getClass();
        //定义Class数组来保存参数对应的类,得到方法时,要用到
        Class [] clazzs = new Class[args.length];
        for(int i=0;i<args.length;i++){
            clazzs[i] = args[i].getClass();
        }
                Method method = clazz.getDeclaredMethod(name, clazzs);
        method.invoke(obj, args);
    }
}

本博客是根据上课老师讲的知识与网上的资料总结得来的,如需转载请注明出处:http://www.cnblogs.com/zhuchenglin/p/8005559.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏塔奇克马敲代码

第 16 章 模板与泛型编程

15220
来自专栏菜鸟计划

javascript 闭包详解

一、什么是匿名函数 创建一个函数并将它赋值给变量functionName,这种情况下创建的函数,即匿名函数。(函数表达式就是匿名函数) 二、闭包 1.什么是闭包...

35570
来自专栏马涛涛的专栏

JS面向对象一:MVC的面向对象封装

Namespace 命名空间 允许开发人员在一个独特, 应用相关的名字的名称下捆绑所有功能的容器。 Class 类 定义对象的特征。它是对象的属性和方法的模板定...

20720
来自专栏Golang语言社区

在Go语言中使用JSON

Encode 将一个对象编码成JSON数据,接受一个interface{}对象,返回[]byte和error: func Marshal(v interfac...

35990
来自专栏项勇

笔记10 | 学习整理静态static 和 终态final

14250
来自专栏xx_Cc的学习总结专栏

iOS底层原理总结 - 探寻block的本质(二)

32640
来自专栏Zephery

2017-03-14学习笔记

1.Integer和int,装箱拆箱 1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)...

367140
来自专栏IMWeb前端团队

ECMAScript 6 新特性总结

本文作者:IMWeb 张颖 原文出处:IMWeb社区 未经同意,禁止转载 前言 个人感觉ECMAScript 6总体上来说:添加了块级作用域,增加了一...

47560
来自专栏分布式系统和大数据处理

ES6中的Generator函数

之前在React项目中,遇到异步请求,都是通过redux-thunk来处理,但使用这种方式,action就变得不那么纯净了。当前新的趋势是使用redux-sag...

15430
来自专栏逆向与安全

从虚拟机角度看Java多态->(重写override)的实现原理

工具与环境: Windows 7 x64企业版 Cygwin x64 jdk1.8.0_162 openjdk-8u40-src-b25-10_feb_201...

25900

扫码关注云+社区

领取腾讯云代金券