java中的反射

一、什么是反射

  简单来说,java反射机制其实就是I/O流的一种封装版,用来快速读取硬盘上的class文件。class文件相当于一个身份证,JVM在操作某一个对象时,需要根据身份证获得对象拥有的属性和拥有的功能及方法。这种动态获取的信息以及动态调用对象方法的功能称为java语言的反射机制。

二、官方提供的反射机制API:

        class文件: java.lang.reflect.Class类:描述内存中class文件

  属性(数据存储单位): java.lang.reflect.Field类:描述内存中class文件中属性

  方法:    构造方法: java.lang.reflect.Construtcor类:描述内存中class文件构造方法

       功能性方法:  java.lang.reflect.Method类:描述内存中class文件功能方法

三、加载硬盘上的class文件三种方式:

  1、Class.forName();

  2、类名.class;

  3、对象.getClass();

四、获取内存中类文件包含的属性信息:

  Class管理内存中class文件。提供对应方法读取class文件中的属性信息

    1、读取仅仅在当前class文件定义的属性的方法:

        getDeclaredFields();

    2、读取在当前class文件定义的以及从父类中继承而来的公有属性的方法:

        getFields();

五、java中反射机制的优缺点:

  优点:1、能够在运行时动态获取类的信息,大大地提供里程序的灵活性和扩展性;

     2、和动态编译功能相结合,可以实现超强的功能。

  缺点:1、比较耗费资源,大幅降低程序运行时的性能;

     2、破坏了程序的封装性,可以通过反射来获取某个类的私有属性,相对来说降低了程序的安全性。

  总结:任何事物都有其两面性,没有好与坏,能够在不同的场景下灵活运用才是关键。

六、让代码告诉你这一切:

 1 package com.bjpowernode.util;
 2
 3 import java.lang.reflect.Field;
 4
 5 public class ReflectUtil {
 6     /**
 7      * 如果当前工程java project:classPath
 8      * @param classPath
 9      * @throws ClassNotFoundException
10      */
11     public static void load(String classPath) throws ClassNotFoundException{
12         Class classObj = Class.forName(classPath);
13     }
14     /**
15      * 一个类在运行期间,只会被加载到内存一次
16      * 此时如何定位内存中的类文件 通知JVM
17      * 到内存中找到studentVo.class文件
18      * @param classObj
19      */
20     public static void load(Class classObj){
21
22     }
23     /**
24      * 通知JVM定位当前对象隶属的class文件所在内存中的位置
25      * @param obj
26      */
27     public static void load(Object obj){
28         obj.getClass();
29     }
30
31     /**
32      * 功能:获得当前对象拥有的共有属性
33      * @param obj
34      */
35     public static void getInfo(Object obj){
36         Class classObj = obj.getClass();
37         Field fieldArray[] = classObj.getFields();
38         for(int i=0;i<fieldArray.length;i++){
39             Field fieldObj = fieldArray[i];
40             String fieldName= fieldObj.getName();
41             System.out.println(fieldName);
42         }
43     }
44
45     public static void getInfo2(Object obj){
46         Class classObj = obj.getClass();
47         Field fieldArray[] = classObj.getDeclaredFields();
48         for (int i = 0; i < fieldArray.length; i++) {
49             Field fieldObj = fieldArray[i];
50             String fieldName = fieldObj.getName();
51             String typeName = fieldObj.getType().getName();
52             System.out.println("属性名"+fieldName+"数据类型名"+typeName);
53         }
54     }
55
56
57 }

1 package com.bjpowernode.entity;
2
3 public class Person {
4     public String name;
5
6 }

1 package com.bjpowernode.entity;
2
3 public class StudentVO extends Person {
4     public int sid;
5     protected int age;
6     private int score;
7
8 }

 1 package com.bjpowernode.def;
 2
 3 import com.bjpowernode.entity.StudentVO;
 4 import com.bjpowernode.util.ReflectUtil;
 5
 6 public class 获得陌生对象中共有属性名称 {
 7
 8     public static void main(String[] args) {
 9
10         Object stu = new StudentVO();
11         ReflectUtil.getInfo(stu);
12
13     }
14
15 }

 1 package com.bjpowernode.def;
 2
 3 import com.bjpowernode.entity.StudentVO;
 4 import com.bjpowernode.util.ReflectUtil;
 5
 6 public class 获得陌生对象定义的所有属性 {
 7
 8     public static void main(String[] args) {
 9         Object obj = new StudentVO();
10         ReflectUtil.getInfo2(obj);
11
12     }
13
14 }

时间: 2024-08-03 08:58:28

java中的反射的相关文章

java中利用反射机制绕开编译器对泛型的类型限制

首先看下面这个例子 public static void main(String[] args) { ArrayList<Integer> al1 = new ArrayList<Integer>(); al1.add(1); ArrayList<String> al2 = new ArrayList<String>(); al2.add("hello"); //int型链表和string型链表,结果为true System.out.pr

Java中的反射——(1)什么是反射

Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class. public class ReflectTest { public static void main(String[] args) throws ClassNotFoundException { String str1 = "abc"; Class cls1 = String.class; Class cls2 = str1.getClass(); Class cls3 = Class.forNa

浅说Java中的反射机制(二)

写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编译执行java文件时,会生成一个.class文件,反射就是一个反编译的过程,它可以通过.class文件得到一个java对象.一个类会有很多组成部分,比如成员变量.成员方法.构造方法等,反射可以通过加载类(加载类是个什么东西?一直搞不清楚),解剖出类的各个组成部分. 为什么要用反射? 我们需要访问一个

JAVA中的反射只获取属性的get方法

JAVA中的反射只获取属性的get方法 在开发过程中,我们经常需要获取类中某些属性的get方法,此时我们需要使用到反射,例如,我们在获得一个对象后,需要知道该对象的哪些属性有值,哪些没有值,方便我们后面的处理. 譬如在我们拼SQL语句时,就需要知道哪些字段为空或为NULL,此时我们在拼语句的时候需要剔除掉,若是我们采用一般的判断的办法,则会很复杂(需要处理好SQL中的AND关键字的有无 ),当然,我们也有另外的解决办法(例如将非空的键和值存入map中,再将map存入list集合中,然后循环集合做

关于JAVA中的反射机制的总结

JAVA中的反射机制是一种能够大大增强程序扩展性的技术.当一个程序封装完成后(生成exe文件),如果想要对该程序进行功能扩展,不用进行代码的从新修改(也不可能拿到源码),只要修改配置文件(一般是XML)就可以完成. 这样的程序为外部提供了一个接口,只要按照该接口的规则定义一个对象(功能),即可以为应用程序扩展该功能. 可以这样比喻,你买了一块电脑主板(封装好的程序),此时你想要添加一块声卡(要扩展的功能),此时只能够通过一个pci接口(应用程序提供的接口)来进行扩展.声卡的接口必须符合PCI的规

Java 中的反射机制

一.什么是Java中的反射: Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性和方法.Java 的这一能力在实际应用中用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性.例如,Pascal.C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息.Reflection 是 Java 被视为动态(或准动态)语言的关键,允许程序于执行期 Reflection APIs 取得任何已知名称之

java中使用反射获取pojo(实体)类的全部字段值

说起反射.不得不说它实在是太强大了,通过反射就能够轻轻松松拿到各种东东,假设你想在项目中解除对某个类的依赖,能够考虑用反射. 今天跟大家分享的是通过java中的反射,获取pojo类的全部字段值. 为什么要做这个操作的呢?主要是为了重写实体类的toString方法.有人会说.直接重写toString方法.返回字段.toString()的字符串不就可以了. 这么做的确能够.可是假设你的pojo类有上百个,上千个,你还要一个一个改吗?所以我们须要从新的方向去解决. 由于我们全部的pojo类.都继承一个

java中的反射机制在Android开发中的用处

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.      然而在android中Google很多的类的某些方法不让第三方应用去调用,通过java反射机制能把这些隐藏方法获取出来并调用,三方应用上我们就很方便的去用这些方法.      例如我们需要安全的杀死某个应用的服务和进程调用ActivityManager.forceStopPack

黑马程序员【java中的反射机制】

Java中的反射机制 ------- android培训.java培训.期待与您交流! ---------- java的反射机制是java的特性之一,反射机制是构建框架技术的基础所在,使用反射可以使程序更加灵活,避免将程序写死在代码里.相对于很多初学者只接触过java基础的人,反射还是一个很朦胧难懂的概念,下面我们就来说一下反射的一些应用. java反射机制是指在运行状态中,动态获取信息以及动态调用对象方法的功能.java反射有3个动态性质:1.运行时生成对象实例,2.运行期间调用发放,3.运行

第二篇 java中的反射

java中的反射 一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.要想解剖一个类,必须先要获取到该类的字节码文件对象. 而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象. 1.创建实体类 1 public class User { 2 private int id; 3 pr