java--反射的基本概念
- 使用import 导入类所在的包;(类:java.lang.Class)
- 明确的使用类名称或借口名称定义对象;
- 通过关键字new进行类对象实例化;(构造方法:java.lang.reflect.Constructor);
- 产生对象可以使用“对象.属性”进行类中属性的调用(属性:java.lang.reflect.Field);
- 通过“对象.方法()”调用类中方法(方法:java.lang.reflect.Method);
- 对象克隆:protected Object clone() throws CloneNotSupportedException 创建并返回此对象的副本。 “复制”的精确含义可能取决于对象的类。
- 为什么克隆方法返回的是Object? 答:因为克隆方法可能针对所有类对象使用,为了统一参数用Object
- 克隆对象所在的类一定要实现java.lang.Cloneable接口而子类只需要继续调用Object 的克隆方法就可以成功实现克隆操作;
- 对象输出:public String toString() 返回对象的字符串表示形式。
- 直接输出对象时会默认调用toString()方法
- 原因:由于平时我们会直接System.out.println();来直接输出对象,那么我们打开源码看一下为什么会默认调用toString()方法
- 对象比较:public boolean equals(Object obj) 指示一些其他对象是否等于此。
- 有哪些时候会隐式调用此方法??
- 当我们保存Set集合时,会依靠hashCode()和equals()判断对象是否重复;
- 取得对象的hash码:public boolean equals(Object obj) 指示一些其他对象是否等于此。
- 可以理解为每一个对象的唯一编码,比较时会先判断编码是否相同,然后再调用equals方法判断是否相同
- 取得Class类对象:public final Class<?> getClass() 返回此Object的运行时类。
- 通过一个已经实例化好的对象进行对象的反射操作;
- 线程等待:public final void wait() throws InterruptedException 导致当前线程等到另一个线程调用该对象的notify()方法或notifyAll()方法。 换句话说,这个方法的行为就好像简单地执行调用wait(0) 。
- 执行到此代码时线程要等待执行,直到执行notify()或者notifyAll()方法来唤醒线程;
- 一个线程唤醒:public final void notify() 唤醒正在等待对象监视器的单个线程。
- 全部线程唤醒:public final void notifyAll() 唤醒正在等待对象监视器的所有线程。
- 垃圾回收前释放:protected void finalize() throws Throwable 已过时。 定稿机制本质上是有问题的。 定稿可能导致性能问题,死锁和挂起。
- 当使用gc回收无用的垃圾空间时默认调用;
- Object类提供了一个返回Class类对象的方法:public final Class<?> getClass();
- 利用“类.class”取得,日后建的最多的就是在Hibernate上;
- 利用Class类的static方法取得,public static Class<?> forName(String className) throws ClassNotFoundException 返回与给定字符串名称的类或接口相关联的Class对象。
public class R {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("test.Student");
//jdk 1.9 开始直接使用的newInstance()方法已经过时,可以使用下面的方式来调用newInstance()方法
//相当于关键字new实例化对象。等价于 Object newInstance = new Student();Object newInstance = cls.getDeclaredConstructor().newInstance(); } }
class Student{ public Student() { System.out.println("构造方法Student");
} }
- public Constructor<T> getConstructor(Class<?>... parameterTypes) (重点使用)
- public Class<?>[] getDeclaredClasses() throws SecurityException
import java.lang.reflect.Constructor;
public class GetStringConstructor {
public static void main(String[] args) throws Exception {
Class<?> forName = Class.forName("java.lang.String");
Constructor<?>[] constructors = forName.getConstructors();//得到所有构造
for (int i = 0; i < constructors.length; i++) { System.out.println(constructors[i]); } } }
执行结果:
public java.lang.String(byte[])
public java.lang.String(byte[],int,int)
public java.lang.String(byte[],java.nio.charset.Charset)
public java.lang.String(byte[],java.lang.String) throws java.io.UnsupportedEncodingException
public java.lang.String(byte[],int,int,java.nio.charset.Charset)
public java.lang.String(java.lang.StringBuilder)
public java.lang.String(java.lang.StringBuffer)
public java.lang.String(char[],int,int)
public java.lang.String(char[])
public java.lang.String(java.lang.String)
public java.lang.String()
public java.lang.String(byte[],int,int,java.lang.String) throws java.io.UnsupportedEncodingException
public java.lang.String(byte[],int)
public java.lang.String(byte[],int,int,int)
public java.lang.String(int[],int,int
import java.lang.reflect.Constructor;
class Student{
public Student(String str) {
System.out.println("构造方法Student: "+str);
}
}
public class GetStringConstructor {
public static void main(String[] args) throws Exception
{ Class<?> forName = Class.forName("test.Student");
Constructor<?> constructors = forName.getConstructor(String.class);
//从这可以看到要与想调用的构造方法的参数类型一直才可以
constructors.newInstance("纯菜鸟-java-反射"); } }
import java.lang.reflect.Method;
class Student {
private String Student(String name,Integer age) {
return name + " " + age;
}
}
public class R {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("test.Student"); //获取对象
{
Method[] methods = cls.getMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println(methods[i]);
}
}
{
System.out.println("=======================================");
Method[] methods = cls.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println(methods[i]);
}
}
}
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
=======================================
private java.lang.String test.Student.Student(java.lang.String,java.lang.Integer)
- public int getModifiers() 返回此类或接口的Java语言修饰符,以整数编码。
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
class Student {
private String Student(String name,Integer age) {
return name + " " + age;
}
}
public class R {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("test.Student"); //获取对象
{
Method[] methods = cls.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println(methods[i].getModifiers());
System.out.println(Modifier.toString(methods[i].getModifiers()));
}
}
}
}
package test; import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
class Student {
private static String rr(String name,Integer age) {
return name + " " + age;
}
public final void tt() throws Exception{ }
}
public class R {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("test.Student"); //获取对象
{
//只有在正真调用本类方法的时候才需要创建实例对象
Method[] methods = cls.getDeclaredMethods();//获取对象的本类方法
for (int i = 0; i < methods.length; i++) {
//由于methods[i].getModifiers()返回的是修饰符的数值,可以用Modifier.toString()方法将其转换成字符类型的修饰符
System.out.print(Modifier.toString(methods[i].getModifiers()));
//得到方法的返回值类型,这时候返回的是全类名类似于java.lang.String,getSimpleName()可以的到简单类名
System.out.print(" "+methods[i].getReturnType().getSimpleName());
//返回方法名
System.out.print(" "+methods[i].getName());
//返回抛出的错误类型数组
Class<?>[] exceptionTypes = methods[i].getExceptionTypes();
if(exceptionTypes.length>0) {
System.out.print(" throws ");
for (int j = 0; j < exceptionTypes.length; j++) {
//取得错误的简单类名
System.out.print(exceptionTypes[j].getSimpleName());
if(exceptionTypes.length-1>j) {
System.out.print(",");
}
}
}
System.out.print("(");
//返回此时方法的全部参数类型
Parameter[] parameters = methods[i].getParameters();
for (int j = 0; j < parameters.length; j++) {
//每一个参数类型得到类型后再次得到简单类名,方便看
System.out.print(parameters[j].getType().getSimpleName()+" arg"+j);
if(j+1<parameters.length) {
System.out.print(",");
}
}
System.out.print(")");
System.out.println("{}");
}
}
}
}
执行结果:
import java.lang.reflect.Method;
class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class R {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("test.Student"); //获取对象
Object object = cls.getDeclaredConstructor().newInstance();//获取实例对象
Method method = cls.getMethod("setName", String.class);//得到setName对象
Method method2 = cls.getMethod("getName");
method.invoke(object, "纯菜鸟");//setName方法赋值
Object invoke2 = method2.invoke(object);//调用getName
System.out.println(invoke2);
}
}
package test; import java.lang.reflect.Field; interface People{
public static final String age = "男";
}
class Person{
private String name;
}
class Student extends Person implements People{
private String school;
}
public class R {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("test.Student"); //获取对象
{
//获得本类的属性
System.out.println("================本类属性==================");
Field[] declaredFields = cls.getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
System.out.println(declaredFields[i]);
}
}
{
//获得父类的属性
System.out.println("================父类属性==================");
//在这是已经得到父类的对象,所以再调用本类的属性方法时是在调父类中的属性
Field[] declaredFields = cls.getSuperclass().getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
System.out.println(declaredFields[i]);
}
}
{
//获得父类的属性
System.out.println("================接口属性==================");
Field[] declaredFields = cls.getFields();
for (int i = 0; i < declaredFields.length; i++) {
System.out.println(declaredFields[i]);
}
}
}
}
import java.lang.reflect.Field;
class Student {
private String school;
}
public class R {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("test.Student"); //获取对象
Object student = cls.getDeclaredConstructor().newInstance();
Field school = cls.getDeclaredField("school");
school.set(student, "河北软件");
Object object = school.get(student);
System.out.println(object);
}
}
java--反射的基本概念的更多相关文章
- Java反射机制一 概念和简单的使用方法。
一 概念 java反射机制属于 java动态性之一 ,指的是可以运行时加载,探知,使用编译期间完全未知的类,程序在运行状态中,可以动态的加载一个只有, 名称的类,对于任意一个已加载的类,都能够知道这 ...
- JAVA反射机制基础概念
反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠覆原来对java的理解. J ...
- Java反射之基础概念
0.实例准备 package com.blueStarWei.invoke; public class Student { private String name; public Student() ...
- 转!!java反射机制
Java 反射机制 基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象 ...
- Java 反射机制(包括组成、结构、示例说明等内容)
第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还原“类的全部的信息”.这里“类的部分已经的信息”,可以是“类名”或“类的对象” ...
- Java反射学习一
Java 反射机制 基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象 ...
- Java 反射机制介绍
参考文章:http://www.cnblogs.com/skywang12345/p/3345205.html Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还 ...
- java反射之获取类的基本信息(一)
一.反射原理. Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还原“类的全部的信息”.这里“类的部分已经的信息”,可以是“类名”或“类的对象”等信息.“类的全部 ...
- [转载]Java 反射机制(包括组成、结构、示例说明等内容)
FROM:http://www.cnblogs.com/skywang12345/p/3345205.html 第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们 ...
- 浅谈Java反射机制 之 获取类的字节码文件 Class.forName("全路径名") 、getClass()、class
另一个篇:获取 类 的 方法 和 属性(包括构造函数) 先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它 ...
随机推荐
- python中多层循环的一键退出
在单层循环的退出中,使用break即能退出,那么多层循环呢?机智的人们使用flag标识符的方式,例如: a=['a',1,2,3,4] b=['b',1,2,3,4] c=['c',1,2,3,4] ...
- axios发post请求,后端接收不到参数的问题
axios会帮我们自动转换请求数据和响应数据 以及 自动转换JSON数据,我们的请求头转换成 Content-Type变成了application/json;charset=utf-8,然后因为我们的 ...
- idm技术下载百度网盘
原使用教程:https://www.haorenka.org/idm.html 使用idm下载器后实际下载速度,比原网盘客户端快很多 相关软件下载 参考上面的参考教程,这里只提供对应所需要的文件,有的 ...
- 热修复干货| AndFix热补丁动态修复框架使用教程
本篇文章会与大家一起学习使用阿里的AndFix热修复框架,可以说AndFix是国内热修复技术的开山始祖,尽管现在阿里已经放弃了对这个项目的维护,但是后来很多的热修复技术都借鉴了这一框架的实现思路. 1 ...
- xticks,yticks
原本的图片如下所示: 如果加上这样的语句: import matplotlib.pyplot as plt plt.xticks([]),plt.yticks([]) 显示结果就为:
- SpringCloud服务注册与发现中心-Eureka
1.服务注册与发现的好处: 假设没有这个东西,那么如果存在a,b,c三个同样的服务: 而现在有一个u服务需要用到a或b或c提供的接口,那么u里面肯定是需要配置这三个服务的地址,然后调用的时候还有问题就 ...
- 021 Android 查询已经导入到工程中的数据库+抖动效果
1.将数据库(.db)文件放入工程中 在project状态下,新建assets文件夹,并将数据库文件放入assets目录下. 注意:assets目录.java目录.res目录是同级的 new---&g ...
- Nginx 系列教程
Nginx(一):Nginx介绍 Nginx(二):编译安装Nginx及参数说明 Nginx(三):nginx.conf配置文件说明 [1] 配置参数说明 Nginx(三):nginx.conf配置文 ...
- git使用mvn clean install 报错原因排查
使用命令行git-bath.exe 来拉代码并进行编译之类的服务,结果在拉依赖时一直报错连的是144.131.254.26,看了maven的setting配置 文件 没并没有错, 最终定位问题是 gi ...
- Zuul【限流】
在项目中,大部分都会使用到hyrtrix做熔断机制,通过某个预定的阈值来对异常流量进行降级处理,除了做服务降级以外,还可以对服务进行限流,分流,排队等. 当然,zuul也能做到限流策略,最简单的方式就 ...