Java reflect 反射 1
1 反射的概述
反射含义:可以获取正在运行的Java对象。
JAVA反射机制是在运行状态中,对于任意一个类,都能够得到这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.
反射就是让你可以通过名称来得到对象(类,属性,方法)的技术。
例如我们可以通过类名来生成一个类的实例, 知道了方法名,就可以调用这个方法; 知道了属性名就可以访问这个属性的值
- Java反射的功能
1)可以判断运行时对象所属的类
2)可以判断运行时对象所具有的成员变量和方法
3)通过反射甚至可以调用到private的方法
4)生成动态代理
- 反射用在哪里
反射是Java的高级特性,在框架中大量被使用!我们必须要了解反射,不然无法学好JavaWeb相关的知识!
到底框架是什么? 框架就是将开发中大量重复的代码集中起来写个通用的程序
框架就是用反射来实现的
框架需要现在的类调用将来写的类
框架是将来的程序员调用的,框架不能实现完整的功能,框架只是一些一些通用的代码
框架要运行一定会依赖将来写的类
现在写的类要调用将来写的类,我们先针对接口进行调用,将来的类需要实现接口,那么方法就固定了
但是将来写的类的类名我们无法获知,这时就需要调用者通过配置文件告诉框架具体的类
2 反射相关类
l Class: 表示类;
l Field: 表示成员变量;
l Method:表示方法;
l Constructor:表示构造器。
注意:与反射相关的类们,它们都不能new!!!
1)Class:它表示正在运行的Java应用程序中的类和接口
2)Field:提供有关类或接口的属性信息,以及对它的动态访问权限
3)Constructor:提供关于类的单个构造方法的信息以及对它的访问权限
4)Method:提供关于类或接口中某个方法信息
注意:Class类是Java反射中最重要的一个功能类,所有获取对象的信息(包括:方法/属性/构造方法/访问权限)都需要它来实现
3 Class 类
要想解剖一个类,必须先要获取到该类的字节码文件对象-->Class的对象。
而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
一段java代码在程序运行期间会经历三个阶段: source(*.class)-->class-->runtime
每个.class文件被加载到内存后都是一个Class类的对象!例如Demo.class加载到内存后它是Class<Demo>类型的一个对象。

在java中用一个Class对象来表示一个java类的class阶段
学生有什么: ID 姓名 班级 用student类描述
类有什么 : 成员 方法 构造方法 用Class类描述
Class对象封装了一个java类中定义的成员变量、成员方法、构造方法、类名、包名等
同时 成员变量 成员方法 构造方法 也有用于描述各自特点的类
Class类:
* 成员变量 Field
* 构造方法 Constructor
* 成员方法 Method
3.1理解Class类
Person.class(描述所有和李四类似的事物的信息) ----> Person对象 ----->李四(赵六、王五)
Class.class(描述字节码这类事物的特征) –> Class对象—> Person.class字节码(Student.class Boy.class String.class)
所有的Person对象能做的事情都用方法来描述,例如跑步用run方法描述
所有的Class对象(字节码)能做的事情用方法来描述,例如创建对象用newInstance来描述
对象都是根据类创建出来的—>创建一个对象代表李四这个人—>李四(跑起来)
一个Class对象就表示一个.class文件,可以通过Class对象获取这个类的构造器、方法,以及成员变量等。
3.2获取Class类
1 不能通过new的方法获取Class的对象,因为构造方法是private 与反射有关的类均是如此
public final class Class<T> {
private Class() {}
}
2 获取Class类的三种基本方式:
l 类名.class
l 对象.getClass()
l Class.forName(“字符串:类名”)
l 通过类名称.class,对基本类型也支持;在java中所有的类型都会对应一个Class对象
- Class c = int.class;
- Class c = int[].class;
- Class c = String.class
l 通过对象.getClass()方法
- Class c = obj.getClass();
l Class.forName()通过类名称加载类,这种方法只要有类名称就可以得到Class;
- Class c = Class.forName(“cn.jt.Demo”);
示例
// 方式1
Person p = new Person();
Class c = p.getClass();
Person p2 = new Person();
Class c2 = p2.getClass();
System.out.println(p == p2);// false
System.out.println(c == c2);// true
// 方式2
Class c3 = Person.class;
// int.class;
// String.class;
System.out.println(c == c3);
// 方式3
Class c4 = Class.forName("cn.jt.Person");
System.out.println(c == c4);
4 Class类的常用方法
l String getName():获取类名称,包含包名;
l String getSimpleName():获取类名称,不包含包名;
l Class getSupperClass():获取父类的Class,
例如:new Integer(100).getClass().getSupperClass()返回的是Class<Number>!
但new Object().getSupperClass()返回的是null,因为Object没有父类;
l T newInstance():使用本类无参构造器来创建本类对象;
l boolean isArray():是否为数组类型;
l boolean isAnnotation():是否为注解类型;
l boolean isAnnotationPresent(Class annotationClass):当前类是否被annotationClass注解了;
l boolean isEnum():是否为枚举类型;
l boolean isInterface():是否为接口类型;
l boolean isPrimitive():是否为基本类型;
l boolean isSynthetic():是否为引用类型;
其他如获取Method Field Constructor的方法 见后面
练习 :通过反射创建对象
public class Demo1 {
@Test
public void fun1() throws Exception {
String className = "cn.itcast.User";
Class clazz = Class.forName(className);
User user = (User)clazz.newInstance();
System.out.println(user);
}
}
class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
//结果
User [username=null, password=null]
练习:打印继承链
Class clazz = JFrame.class;
System.out.println(class.getName());
for(Class superClass = clazz.getSuperclass();superClass!=null;System.out.println(supperClass.getName())){
}
Java reflect 反射 1的更多相关文章
- Java —— Reflect反射机制
JAVA反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java的反射机制. ...
- java reflect反射调用方法invoke
类定义 package Reflect; public class MyTest { public int a; public static int b; public static final in ...
- Java reflect 反射学习笔记
1. class 类的使用 万事万物皆对象 (基本数据类型, 静态成员不是面向对象), 所以我们创建的每一个类都是对象, 即类本身是java.lang.Class类的实例对象, 但是这些对象不需要 n ...
- java reflect反射---Java高级开发必须懂的
理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助. 一.Class类的使用 1.万事万物皆对象,( ...
- java reflect反射获取方法变量参数
类的成员包含变量(Field),方法(Method),构造器(Constructor) 类定义 package Reflect; public class MyTest { public int a; ...
- Java reflect 反射 2
Constructor Constructor表示一个类的构造器.即构造器的反射对象! 它是Class的一个组成部门,所以需要先得到Class,再通过Class的方法得到Constructor 1获取 ...
- Java reflect 反射 3 Class.forname
Class.forName("xxx.xx.xx") 1 作用:加载类文件Class.forName(xxx.xx.xx) 返回的是一个类 而非对象 作用就是把对象的模板加载到内存 ...
- Java reflect 反射 0 java对象的三个阶段
- Java反射学习(java reflect)(二)
ok之前说了Java的反射和反射分析类,那这些东西有神马作用呢,下面就来说应用: 三.运行时使用反射分析对象 简单写一个Employee类,然后利用JAVA反射去取name域,getDeclareFi ...
随机推荐
- [Elixir002]节点启动后自动连接其它节点
问题: 如何指定一个节点在启动后自动连接到别的节点上? 这个我们要使用到sys.config,这是erlang的配置文件,这个文件一般都是$ROOT/releases/Vsn下 1. 首先我们要先启动 ...
- js自执行函数、调用递归函数、圆括号运算符、函数声明的提升
前言 起因是我要在jquery的ajax中需要根据返回值来决定是否继续发起ajax请求,这是一个有条件的循环,符合条件就跳出.可以使用while循环的,但是想了想还是递归调用好用. 调用递归函数 递归 ...
- ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例
HTML代码 和js 代码 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name=&quo ...
- c# Net XML文档(2,2)中有错误
错误如图所示: xml转实体,需求很简单,度娘找了几个方法试了下,转换代码仔细看了看 没毛病啊 但是 就是提示 XML文档(2,2)中有错误,百度搜索了一大会 没解决方案,仔细分析了一下, 最后发现 ...
- “全栈2019”Java多线程第一章:认识多线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- codeforces 1093 题解
12.18 update:补充了 $ F $ 题的题解 A 题: 题目保证一定有解,就可以考虑用 $ 2 $ 和 $ 3 $ 来凑出这个数 $ n $ 如果 $ n $ 是偶数,我们用 $ n / 2 ...
- docker设置引用国内镜像加速
设置步骤: 1 先到daocloud.io网站注册一个账号 过程略,注册成功后,进入控制台 2 点击控制台上的加速器 拉到中间部分,有一个『主机监控程序』的文字链接,见下图: 然后选择主机类型,我用的 ...
- 多并发编程基础 之线程程 Thried
原贴 https://www.cnblogs.com/gbq-dog/p/10365669.html 今日要整理的内容有 1. 操作系统中线程理论 2.python中的GIL锁 3.线程在python ...
- 类型转换:static_cast、reinterpret_cast等
一.隐式类型转换 系统自动进行,不需要程序开发人员介入. int m = 3 + 45.6;// 48 把小数部分截掉,也属于隐式类型转换的一部分 double b = 3 + 45.6; // 48 ...
- STM32-RTC实时时钟-毫秒计时实现
OS:Windows 64 Development kit:MDK5.14 IDE:UV4 MCU:STM32F103C8T6 1.RTC时钟简介 STM32 的实时时钟(RTC)是一个独立的定时器, ...