实现方式
  反编译:.class–>.java
  通过反射机制访问java对象的属性,方法,构造方法等
涉及类
  java.lang.Class;
  java.lang.reflect.Constructor;
  java.lang.reflect.Field;
  java.lang.reflect.Method;
  java.lang.reflect.Modifier;
Field
  Java反射中Field用于获取某个类的属性或该属性的属性值

反射获取类的三种方法

Class c1 = Class.forName("Book");
Class c2 = Book.class; // Java中每个类型都有class属性
Book book= new Book(); // java语言中任何一个java对象都有getClass 方法
Class c3 = book.getClass(); // c3是运行时类 (book的运行时类是Book)

创建对象
获取类以后我们来创建它的对象,利用newInstance:

Class c =Class.forName("Book");  

// 创建此Class 对象所表示的类的一个新实例
Object o = c.newInstance(); // 调用Book的无参数构造方法.

获取所有属性

Class c = Class.forName("java.lang.Integer"); // 获取整个类
Field[] fs = c.getDeclaredFields(); // 获取所有的属性
StringBuffer sb = new StringBuffer(); // 定义可变长的字符串,用来存储属性 sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n"); // 通过追加的方法,将public定义里边的每一个属性拼接到此字符串中
for(Field field:fs){
sb.append("\t"); // Tab
sb.append(Modifier.toString(field.getModifiers())+" "); // 获得属性的修饰符,例如public,static等
sb.append(field.getType().getSimpleName() + " ");// 属性的类型的名字
sb.append(field.getName()+";\n"); // 属性名字+回车换行
}
sb.append("}");
System.out.println(sb);

获取指定属性

Class c = Class.forName("User"); // 获取类
Field idF = c.getDeclaredField("id"); // 获取id属性
Object o = c.newInstance(); // 实例化这个类赋给o
idF.setAccessible(true); // 打破封装 :使用反射机制可以打破封装性,导致了对象的属性不安全。
idF.set(o, "110"); // set,给o对象的id属性赋值"110"
System.out.println(idF.get(o)); // get

获取方法和构造方法

使用反射进行泛型擦除

package com.test;

import java.lang.reflect.Method;
import java.util.ArrayList; public class test_fanxing {
/**
* * ArrayList<Integer>的一个对象,在这个集合中添加一个字符串数据,如何实现呢?
* 泛型只在编译期有效,在运行期会被擦除掉*/
public static void main(String[] args) throws Exception{
ArrayList<Integer> list=new ArrayList<>();
list.add(123);
list.add(321);
//list.add( "www"); 将会报错 为了解决这个问题,我们对其add方法进行反射,讲字符串添加进去
//因为不在编译期 所以泛型无效
Class clazz=Class.forName("java.util.ArrayList");
Method m=clazz.getMethod("add",Object.class); //API add(E e) 参数Object
m.invoke(list,"www");
System.out.println(list); //[123, 321, www] 成功反射进来字符串 }
}

Java的反射机制与泛型擦除的更多相关文章

  1. Java的反射机制和动态代理

    介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大的功能,可以原 ...

  2. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  3. java笔记--反射机制之基础总结与详解

    一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...

  4. java笔录---反射机制(1)

    引言   为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架,   像spring中核心模块IO ...

  5. 面试题思考:什么是 Java 的反射机制

    一.反射机制概述 Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法.这种在运行时动态的获取信息以及动态调用对象的方法 ...

  6. Java —— Reflect反射机制

    JAVA反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java的反射机制. ...

  7. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  8. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  9. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

随机推荐

  1. Flume的Source

    source学习网址: http://flume.apache.org/FlumeUserGuide.html 一.Avro 类型的Source 监听Avro 端口来接收外部avro客户端的事件流.和 ...

  2. VC的function类说明 -- 继续

    我在之前的随笔中介绍了function如何保存参数,如何实现调用相关知识.对于一个函数对象或者函数指针来说,应该很容易理解.不过对于如何在function中保存类的成员函数,这个还是值得一说的. 还是 ...

  3. PHP——抽象类与接口的区别

    在学习PHP面向对象时,都会在抽象类与接口上迷惑,作用差不多为什么还那么容易混淆,何不留一去一?但是事实上两者的区别还是很大的,如果能够很好地运用PHP的两个方法,面向对象的程序设计将会更加合理.清晰 ...

  4. T-SQL 事务2

    启用事务完成转账存储过程 use StudentManager go if exists(select * from sysobjects where name='usp_TransferAccoun ...

  5. 关于Element UI中页面样式小问题

    一,修改组件dialog窗口的大小 二,在我使用upload组件上传一张美女图片时,发现当预览图片时,图片是灰色的,点击一下才会变亮,这种效果使我很不舒服,于是我通过添加下面的一条样式,问题解决了(可 ...

  6. hook mono实现Assembly.Load从指定路径读取文件

    mono-unity github: https://github.com/Unity-Technologies/mono/blob/unity-staging/mono/metadata/assem ...

  7. 多线程Task

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  8. RxJava学习;数据转换、线程切换;

    Observable(被观察者,发射器)发送数据: just:发送单个的数据: Observable.just("cui","chen","bo&qu ...

  9. [TJOI2015]弦论(后缀自动机)

    /* 一道在树上乱搞的题目 建立出parent树来, 然后就能搞出每个节点往后能扩展出几个串, 至于位置不同算同一个的话就强制让right集合大小为1即可 然后在树上类比权值线段树找第k大26分统计一 ...

  10. for循环案例

    for循环案例 今天给大家介绍点for循环的案例 1.大马驮2石粮食,中马驮1石粮食,两头小马驮一石粮食,要用100匹马,驮100石粮食,该如何调配? <!DOCTYPE html> &l ...