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(); 需要强制类型转换

  1. package reflexdemo;
  2.  
  3. /**
  4. * @2018年4月6日
  5. * @王 鸿
  6. * @Administrator
  7. */
  8. public class Foot {
  9. public int age = 10;
  10. }
  11.  
  12. 测试类
  13.  
  14. package reflexdemo;
  15.  
  16. /**
  17. * @2018年4月6日
  18. * @王 鸿
  19. * @Administrator
  20. */
  21. public class Refle_Demo_01 {
  22. public static void main(String[] args) throws Exception {
  23. // 创建一个Foot的实例对象
  24. Foot foot = new Foot();
  25. // 第一种 Foot这个类也是一个实例对象,Class类的对象
  26. Class c1 = Foot.class;
  27. // 第二种通过对象.getclass方法
  28. Class c2 = foot.getClass();
  29. // 不管 c1 ,c2 都代表着Foot类的类型,一个类只可能是class类的一个实例对象
  30. System.out.println(c1 == c2);
  31. // 第三种表达方式
  32. Class c3 = null;
  33. // Class.forname中是类的全路径(含包名)
  34. c3 = Class.forName("reflexdemo.Foot");
  35. System.out.println(c2 == c3);
  36. // 创建类的实例
  37. Foot foot1 = (Foot) c3.newInstance();// 需要无参的构造
  38. System.out.println(foot1.age);
  39. }
  40. }

为什么需要反射?

1 通过new创建对象 是静态加载类,在编译时刻就需要加载所有的可能使用的类 (通过动态加载类可以解决该问题)
2 动态加载类是在运行的时刻加载 ------------------(一般情况下功能性的类使用动态加载类)

动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多 态的应用,有以降低类之间的藕合性("套用别的博客一句话")

下面的代码可以看到通过类 来反射类的信息 包括构造 还有方法

  1. package datatype;
  2.  
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.Field;
  5. import java.lang.reflect.Method;
  6.  
  7. /**
  8. * @2018年4月7日
  9. * @王 鸿
  10. * @Administrator
  11. */
  12. public class ClassMessage {
  13. /*
  14. * 打印类的信息 包括类的成员函数成员变量
  15. */
  16. public static void print(Object obj) {
  17. // 要获取类的信息 首先获取类的类类型
  18. Class c = obj.getClass(); // 传递的是那个子类的对象 c 就是那个类的类类型
  19. // 获取类的名称
  20. System.out.println("类的名称:" + c.getClass());
  21. /*
  22. * 一个成员方法就是一个 Method对象 .getMethods()是获取所有的public的函数包括父类继承而来
  23. *
  24. * getDeclaredMethods()获取的是所有该类自己声明方法
  25. */
  26.  
  27. Method[] methods = c.getMethods();
  28. for (int i = 0; i < methods.length; i++) {
  29. // 的到方法的返回类型
  30. Class returnType = methods[i].getReturnType();
  31. System.out.print(returnType.getName());
  32. // 得到方法的名称
  33. System.out.print(methods[i].getName() + "(");
  34. // 获取参数的类型-->得到的是参数列表的类类型
  35. Class[] parameterTypes = methods[i].getParameterTypes();
  36. for (Class class1 : parameterTypes) {
  37. System.out.print(class1.getName());
  38. }
  39. System.out.println(")");
  40. FiledMessage(c);
  41. }
  42.  
  43. }
  44.  
  45. /*
  46. * 获取成员变量的信息
  47. */
  48. public static void FiledMessage(Object obj) {
  49. Class c = obj.getClass();
  50. Field[] declaredFields = c.getDeclaredFields();
  51. for (Field field : declaredFields) {
  52. // 得到成员变量的类型的类类行
  53. Class filedtype = field.getType();
  54. String name = filedtype.getName();
  55. // 得到成员变量的名称
  56. String filename = field.getName();
  57. System.out.println(name + " " + filename);
  58. }
  59. }
  60.  
  61. /*
  62. * 打印构造函数的信息 获得所有的构造方法
  63. */
  64. public static void Constructor(Object obj) {
  65. Class c = obj.getClass();
  66. Constructor[] constructors = c.getDeclaredConstructors();
  67. for (Constructor cs : constructors) {
  68. System.out.print(cs.getName() + "(");
  69. // 获取构造函数的参数列表
  70. Class[] parameterTypes = cs.getParameterTypes();
  71. for (Class class1 : parameterTypes) {
  72. System.out.print(class1.getName() + ",");
  73. }
  74. System.out.println(")");
  75. }
  76. }
  77. }
  78.  
  79. /*
  80. *打印方法
  81. * 打印的方法是又新开了一个类
  82. */
  83. package datatype;
  84.  
  85. import java.lang.reflect.Method;
  86.  
  87. /**
  88. * @2018年4月8日
  89. * @王 鸿
  90. * @Administrator
  91. */
  92.  
  93. public class MethodMessage {
  94. public static void main(String[] args) throws Exception {
  95. A a = new A();
  96. // 要想获得一个方法的信息首先要获得类的类类型
  97. Class type = a.getClass();
  98. // 获取方法 方法必须要有名称和参数列表
  99. /*
  100. * getMethod 获取的是public的方法 getDeclaredMethod自己声明的方法
  101. */
  102. Method method = type.getDeclaredMethod("append", String.class,
  103. String.class);
  104. // 如果是私有的需要用.setAccessible(true)
  105. method.setAccessible(true);
  106. // 方法没有返回值返回的null 有返回值放回指定的返回值
  107. method.invoke(a, "1", "2");
  108.  
  109. }
  110. }
  111.  
  112. class A {
  113. public void print(int a, int b) {
  114. System.out.println(a + b);
  115. }
  116.  
  117. private void append(String one, String two) {
  118. System.out.println(one + two);
  119. }
  120. }
  121.  
  122. 测试类
  123.  
  124. package datatype;
  125.  
  126. /**
  127. * @2018年4月7日
  128. * @王 鸿
  129. * @Administrator
  130. */
  131. public class ClassMessageText {
  132.  
  133. public static void main(String[] args) {
  134. Integer type = 2;
  135. String string = "s";
  136. // ClassMessage.print(type);
  137. // ClassMessage.FiledMessage(new Integer(1));
  138. ClassMessage.Constructor(string);
  139. }
  140. }

此处指截取了一张构造反射出来的结果

注意: 方法的反射 如果你的方法是私有的 需要加上 方法对象.setAccessible(true)

                             通过反射了解集合泛型的本质
反射的操作都是编译之后的操作,集合的泛型是去泛型化的
 java 中的集合泛型 是防止 错误输入的,只在编译阶段有效 绕过编译就无效了

  1. package genericparadigm;
  2.  
  3. import java.lang.reflect.Method;
  4. import java.util.ArrayList;
  5.  
  6. /**
  7. * @2018年4月8日
  8. * @王 鸿
  9. * @Administrator
  10. */
  11. public class GenericList {
  12. public static void main(String[] args) throws Exception, SecurityException {
  13. // 非泛型集合
  14. ArrayList one = new ArrayList();
  15.  
  16. // 泛型集合
  17. ArrayList<String> list = new ArrayList<String>();
  18.  
  19. Class class1 = one.getClass();
  20. Class class2 = list.getClass();
  21. System.out.println(class1 == class2); // true
  22. Method method = class2.getMethod("add", Object.class);
  23. method.invoke(list, 1);
  24.  
  25. System.out.println(list.size()); //
  26.  
  27. }
  28. }

JAVA 中的 反射的更多相关文章

  1. Java中的反射和注解

    前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...

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

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

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

    写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...

  4. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  5. java中动态反射

    java中动态反射能达到的效果和python的语法糖很像,能够截获方法的实现,在真实方法调用之前和之后进行修改,甚至能够用自己的实现进行特别的替代,也可以用其实现面向切片的部分功能.动态代理可以方便实 ...

  6. 第89节:Java中的反射技术

    第89节:Java中的反射技术 反射技术是动态的获取指定的类,和动态的调用类中的内容(没有类前就可以创建对象,将对象的动作完成,这就是动态的获取指定的类). 配置文件把具体实现的类名称定义到配置文件中 ...

  7. java笔记十:java中的反射

    Java中,反射是一种强大的工具.它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接.反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而 ...

  8. 【Java基础】java中的反射机制与动态代理

    一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...

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

    说起反射.不得不说它实在是太强大了,通过反射就能够轻轻松松拿到各种东东,假设你想在项目中解除对某个类的依赖,能够考虑用反射. 今天跟大家分享的是通过java中的反射,获取pojo类的全部字段值. 为什 ...

  10. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

随机推荐

  1. linux同步与通信

    这几天读完了UNP v2,对进程间通信与同步的方式有所了解,现对主要的知识点总结如下: 根据出现的历史,先有的管道,FIFO,信号,然后是systemV IPC,再是后来的Poxis IPC,syst ...

  2. Android端 高德地图点击得到经纬度

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...

  3. log4net应用实践(一)

          1.背景 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具.它是.Net下一 ...

  4. 大数据(1):基于sogou.500w.utf8数据的MapReduce程序设计

    环境:centos7+hadoop2.5.2 1.使用ECLIPS具打包运行WORDCOUNT实例,统计莎士比亚文集各单词计数(文件SHAKESPEARE.TXT). ①WorldCount.java ...

  5. (转)regex类(个人理解)

    regex类(个人理解)   C#regex是正则表达式类用于string的处理,查找匹配的字符串.1,先看一个例子Regex regex=new Regex(@”OK“)://我们要在目标字符串中找 ...

  6. jQuery中的ajax的相关方法

    JQuery对Ajax操作进行了封装,$.ajax()方法属于最底层的方法,第2层是load().$.get().$.post()方法,第3层是$.getScript()和$.getJSON()方法. ...

  7. CVPR2018: Unsupervised Cross-dataset Person Re-identification by Transfer Learning of Spatio-temporal Patterns

    论文可以在arxiv下载,老板一作,本人二作,也是我们实验室第一篇CCF A类论文,这个方法我们称为TFusion. 代码:https://github.com/ahangchen/TFusion 解 ...

  8. AngularJS复习------表单验证

    在AngularJS中能够将HTML5表单验证功能同自己的验证指令结合起来使用,这里介绍使用的核心功能. 使用表单验证,首先要确保表单的每个控件都有name属性 如果想要屏蔽浏览器对表单的默认验证行为 ...

  9. 【Python】 html解析BeautifulSoup

    BeautifulSoup bs是个html解析模块,常用来做爬虫? ■ 安装 BeautifulSoup可以通过pip来安装,用pip install beautifulsoup4 即可.但是仅仅这 ...

  10. redis备份与恢复

    1.redis的备份 redis需要远程访问 添加密码进行登录,修改主配置文件添加:requirepass xxx redis-cli -h 127.0.0.1 -p 6379 -a 123456 b ...