JAVA 中的 反射
CLASS类
1) 在面向对象的世界里,万事万物皆对象.
在java中有两样东西不是面向对象 1.普通的数据类型(java中有封装类来弥补它) 2. java中静态的东西
2) 类是对象吗? 类是对象,类是java.lang.Class类的实例对象
3) 任何一个类都是CLass类的实例对象,有三种表示方法
第一种表示方法 Class c1 = (类名).class;
实际在告诉我们任何一个类都有一个隐含的静态成员变量class
第二种表示方法 已经知道该类的对象通过getClass方法
第三种官网 c1表示是类的类型(Classtype)万事万物皆对象 类也是对象 是Class类的实例队象这个对象我们称为该类的类类型
Class c3 = null;
c3 = Class.forName("reflexdemo.Foot") Class.forname中是类的全路径(含包名);
我们可以通过类的类类型创建该类 的对象实例 通过c1 或者c3创建
Foot foot=(Foot)c1.newInstance(); 需要强制类型转换
- package reflexdemo;
- /**
- * @2018年4月6日
- * @王 鸿
- * @Administrator
- */
- public class Foot {
- public int age = 10;
- }
- 测试类
- package reflexdemo;
- /**
- * @2018年4月6日
- * @王 鸿
- * @Administrator
- */
- public class Refle_Demo_01 {
- public static void main(String[] args) throws Exception {
- // 创建一个Foot的实例对象
- Foot foot = new Foot();
- // 第一种 Foot这个类也是一个实例对象,Class类的对象
- Class c1 = Foot.class;
- // 第二种通过对象.getclass方法
- Class c2 = foot.getClass();
- // 不管 c1 ,c2 都代表着Foot类的类型,一个类只可能是class类的一个实例对象
- System.out.println(c1 == c2);
- // 第三种表达方式
- Class c3 = null;
- // Class.forname中是类的全路径(含包名)
- c3 = Class.forName("reflexdemo.Foot");
- System.out.println(c2 == c3);
- // 创建类的实例
- Foot foot1 = (Foot) c3.newInstance();// 需要无参的构造
- System.out.println(foot1.age);
- }
- }
为什么需要反射?
1 通过new创建对象 是静态加载类,在编译时刻就需要加载所有的可能使用的类 (通过动态加载类可以解决该问题)
2 动态加载类是在运行的时刻加载 ------------------(一般情况下功能性的类使用动态加载类)
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多 态的应用,有以降低类之间的藕合性("套用别的博客一句话")
下面的代码可以看到通过类 来反射类的信息 包括构造 还有方法
- package datatype;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- /**
- * @2018年4月7日
- * @王 鸿
- * @Administrator
- */
- public class ClassMessage {
- /*
- * 打印类的信息 包括类的成员函数成员变量
- */
- public static void print(Object obj) {
- // 要获取类的信息 首先获取类的类类型
- Class c = obj.getClass(); // 传递的是那个子类的对象 c 就是那个类的类类型
- // 获取类的名称
- System.out.println("类的名称:" + c.getClass());
- /*
- * 一个成员方法就是一个 Method对象 .getMethods()是获取所有的public的函数包括父类继承而来
- *
- * getDeclaredMethods()获取的是所有该类自己声明方法
- */
- Method[] methods = c.getMethods();
- for (int i = 0; i < methods.length; i++) {
- // 的到方法的返回类型
- Class returnType = methods[i].getReturnType();
- System.out.print(returnType.getName());
- // 得到方法的名称
- System.out.print(methods[i].getName() + "(");
- // 获取参数的类型-->得到的是参数列表的类类型
- Class[] parameterTypes = methods[i].getParameterTypes();
- for (Class class1 : parameterTypes) {
- System.out.print(class1.getName());
- }
- System.out.println(")");
- FiledMessage(c);
- }
- }
- /*
- * 获取成员变量的信息
- */
- public static void FiledMessage(Object obj) {
- Class c = obj.getClass();
- Field[] declaredFields = c.getDeclaredFields();
- for (Field field : declaredFields) {
- // 得到成员变量的类型的类类行
- Class filedtype = field.getType();
- String name = filedtype.getName();
- // 得到成员变量的名称
- String filename = field.getName();
- System.out.println(name + " " + filename);
- }
- }
- /*
- * 打印构造函数的信息 获得所有的构造方法
- */
- public static void Constructor(Object obj) {
- Class c = obj.getClass();
- Constructor[] constructors = c.getDeclaredConstructors();
- for (Constructor cs : constructors) {
- System.out.print(cs.getName() + "(");
- // 获取构造函数的参数列表
- Class[] parameterTypes = cs.getParameterTypes();
- for (Class class1 : parameterTypes) {
- System.out.print(class1.getName() + ",");
- }
- System.out.println(")");
- }
- }
- }
- /*
- *打印方法
- * 打印的方法是又新开了一个类
- */
- package datatype;
- import java.lang.reflect.Method;
- /**
- * @2018年4月8日
- * @王 鸿
- * @Administrator
- */
- public class MethodMessage {
- public static void main(String[] args) throws Exception {
- A a = new A();
- // 要想获得一个方法的信息首先要获得类的类类型
- Class type = a.getClass();
- // 获取方法 方法必须要有名称和参数列表
- /*
- * getMethod 获取的是public的方法 getDeclaredMethod自己声明的方法
- */
- Method method = type.getDeclaredMethod("append", String.class,
- String.class);
- // 如果是私有的需要用.setAccessible(true)
- method.setAccessible(true);
- // 方法没有返回值返回的null 有返回值放回指定的返回值
- method.invoke(a, "1", "2");
- }
- }
- class A {
- public void print(int a, int b) {
- System.out.println(a + b);
- }
- private void append(String one, String two) {
- System.out.println(one + two);
- }
- }
- 测试类
- package datatype;
- /**
- * @2018年4月7日
- * @王 鸿
- * @Administrator
- */
- public class ClassMessageText {
- public static void main(String[] args) {
- Integer type = 2;
- String string = "s";
- // ClassMessage.print(type);
- // ClassMessage.FiledMessage(new Integer(1));
- ClassMessage.Constructor(string);
- }
- }
此处指截取了一张构造反射出来的结果
注意: 方法的反射 如果你的方法是私有的 需要加上 方法对象.setAccessible(true)
通过反射了解集合泛型的本质
反射的操作都是编译之后的操作,集合的泛型是去泛型化的
java 中的集合泛型 是防止 错误输入的,只在编译阶段有效 绕过编译就无效了
- package genericparadigm;
- import java.lang.reflect.Method;
- import java.util.ArrayList;
- /**
- * @2018年4月8日
- * @王 鸿
- * @Administrator
- */
- public class GenericList {
- public static void main(String[] args) throws Exception, SecurityException {
- // 非泛型集合
- ArrayList one = new ArrayList();
- // 泛型集合
- ArrayList<String> list = new ArrayList<String>();
- Class class1 = one.getClass();
- Class class2 = list.getClass();
- System.out.println(class1 == class2); // true
- Method method = class2.getMethod("add", Object.class);
- method.invoke(list, 1);
- System.out.println(list.size()); //
- }
- }
JAVA 中的 反射的更多相关文章
- Java中的反射和注解
前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- 浅说Java中的反射机制(二)
写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...
- 浅说Java中的反射机制(一)
在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...
- java中动态反射
java中动态反射能达到的效果和python的语法糖很像,能够截获方法的实现,在真实方法调用之前和之后进行修改,甚至能够用自己的实现进行特别的替代,也可以用其实现面向切片的部分功能.动态代理可以方便实 ...
- 第89节:Java中的反射技术
第89节:Java中的反射技术 反射技术是动态的获取指定的类,和动态的调用类中的内容(没有类前就可以创建对象,将对象的动作完成,这就是动态的获取指定的类). 配置文件把具体实现的类名称定义到配置文件中 ...
- java笔记十:java中的反射
Java中,反射是一种强大的工具.它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接.反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而 ...
- 【Java基础】java中的反射机制与动态代理
一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...
- java中使用反射获取pojo(实体)类的全部字段值
说起反射.不得不说它实在是太强大了,通过反射就能够轻轻松松拿到各种东东,假设你想在项目中解除对某个类的依赖,能够考虑用反射. 今天跟大家分享的是通过java中的反射,获取pojo类的全部字段值. 为什 ...
- java 中利用反射机制获取和设置实体类的属性值
摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...
随机推荐
- linux同步与通信
这几天读完了UNP v2,对进程间通信与同步的方式有所了解,现对主要的知识点总结如下: 根据出现的历史,先有的管道,FIFO,信号,然后是systemV IPC,再是后来的Poxis IPC,syst ...
- Android端 高德地图点击得到经纬度
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...
- log4net应用实践(一)
1.背景 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具.它是.Net下一 ...
- 大数据(1):基于sogou.500w.utf8数据的MapReduce程序设计
环境:centos7+hadoop2.5.2 1.使用ECLIPS具打包运行WORDCOUNT实例,统计莎士比亚文集各单词计数(文件SHAKESPEARE.TXT). ①WorldCount.java ...
- (转)regex类(个人理解)
regex类(个人理解) C#regex是正则表达式类用于string的处理,查找匹配的字符串.1,先看一个例子Regex regex=new Regex(@”OK“)://我们要在目标字符串中找 ...
- jQuery中的ajax的相关方法
JQuery对Ajax操作进行了封装,$.ajax()方法属于最底层的方法,第2层是load().$.get().$.post()方法,第3层是$.getScript()和$.getJSON()方法. ...
- CVPR2018: Unsupervised Cross-dataset Person Re-identification by Transfer Learning of Spatio-temporal Patterns
论文可以在arxiv下载,老板一作,本人二作,也是我们实验室第一篇CCF A类论文,这个方法我们称为TFusion. 代码:https://github.com/ahangchen/TFusion 解 ...
- AngularJS复习------表单验证
在AngularJS中能够将HTML5表单验证功能同自己的验证指令结合起来使用,这里介绍使用的核心功能. 使用表单验证,首先要确保表单的每个控件都有name属性 如果想要屏蔽浏览器对表单的默认验证行为 ...
- 【Python】 html解析BeautifulSoup
BeautifulSoup bs是个html解析模块,常用来做爬虫? ■ 安装 BeautifulSoup可以通过pip来安装,用pip install beautifulsoup4 即可.但是仅仅这 ...
- redis备份与恢复
1.redis的备份 redis需要远程访问 添加密码进行登录,修改主配置文件添加:requirepass xxx redis-cli -h 127.0.0.1 -p 6379 -a 123456 b ...