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 中的 反射的更多相关文章

  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. ASP.NET Core Web 支付功能接入 微信-扫码支付篇

    这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步通知功能. 开发环境:Win 10 x64.VS2017 15.6.4..NET Core SDK ...

  2. 使用angular-ui-router替代ng-router

    angular框架自身提供的ng-route在一定程度上满足了我们的需求,但是他只针对于单视图,比如点击一个link跳转到另一个视图,但是在实际业务中,需要一个状态对应的视图中还包含其他的视图,或者一 ...

  3. 关于html文档的规范

    1. <!DOCTYPE html> 告诉浏览器该文档使用哪种html或xhtml的规范 2. 元数据中的X-UA-Compatible <meta http-equiv=" ...

  4. UVA 10305 Ordering Tasks(拓扑排序的队列解法)

    题目链接: https://vjudge.net/problem/UVA-10305#author=goodlife2017 题目描述 John有n个任务,但是有些任务需要在做完另外一些任务后才能做. ...

  5. python统计词频

    arr = [1,2,3,4,5,6,4,5,2,3,6,8,9,6,5,3,6,2,4]dic={}for item in arr: if item in dic.keys(): dic[item] ...

  6. AndroidStudio R 文件标红

    一种不常见的问题 AndroidStudio 文件大小会有一定的限制,超过一定大小将无法解析.大型的Android项目容易出现这个问题. 可以按照下面的步骤解决这个问题: 在AndroidStudio ...

  7. Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例

    本文目录 1. Net下日志记录 2. NLog的使用     2.1 添加nuget引用NLog.Web.AspNetCore     2.2 配置文件设置     2.3 依赖配置及调用     ...

  8. Webpack执行命令参数详解

    一.概述前面的章节我们讲解了webpack的安装.webpack.config.js的 基本配置.webpack执行命名以及require方法的使用,不 知道大家有没有发现,当我们每次修改或者新增一个 ...

  9. ArrayList 源码分析

    ArrayList 源码分析 1. 结构   首先我们需要对 ArrayList 有一个大致的了解就从结构来看看吧. 1. 继承   该类继承自 AbstractList 这个比较好说 2. 实现 这 ...

  10. mariadb插入中文数据乱码解决过程

    基本情况: 系统:centos 7 mariadb安装方式:yum 乱码解决过程: 查看当前数据库编码(登录数据库后) # show variables like 'character%'; (上图为 ...