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反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它 ...
随机推荐
- vs2010 出错:error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏(转)
“LNK1123:转换到 COFF期间失败:文件无效或损坏”的解决方法 一.错误描述 之前写的程序隔段时间使用VS2010再次运行时出现如下错误: LINK fatal error LNK1123转换 ...
- SAS如何看待大数据
SAS如何看待大数据 "大数据"现在是一个炙手可热的词语,数据分析师这个词虽然比较新,但收集与存储大量信息的历史却不短了. 早在本世纪初,行业分析师Doug Laney就提出了&q ...
- LeetCode_387. First Unique Character in a String
387. First Unique Character in a String Easy Given a string, find the first non-repeating character ...
- Spring Boot系列之-helloword入门
一. What: Spring Boot是什么?以1.4.3.RELEASE为例,官方介绍为:http://docs.spring.io/spring-boot/docs/1.4.3.RELEASE/ ...
- lumen伪静态路由设置示例
lumen路由文件中的配置: $app->get('info-{tid}.html', 'ThreadController@palmInfo'); 控制器中代码示例: public functi ...
- C++高精度整数加减乘除模板
其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的. 其中高精度除法返回一对string,分别表示商和余数. 代码: #include <bits/stdc++.h> ...
- HTML布局排版5 测试某段html页面1
除了div,常见的还有用table布局,这里直接用前面博文的页头页尾,如下面的页面的部分,是个简单的table.该页面样式,如果拖动浏览器,可以看到table和文本框总是居中,但是文本框下方那两个按钮 ...
- NB-IOT技术 UP模式 和CP模式,用户面和控制面,数据面
先看下面的图 UE就是NB-IOT设备,那么UE的数据到应用服务器有3条路可以走 第一条,UE,基站,MME,SCEF,应用服务器,这个是CP模式,也叫控制面,也叫信令无线承载面,也叫控制面承载,叫法 ...
- Ubuntu开发环境配置
主要是: 源的更新 安装vim编辑器 远程登录xrdp相关配置 synergy symless键鼠共享配置 对新买的硬盘进行格式化和分区 vsftp环境搭建 gcc开发环境配置 qt5开发环境配置 m ...
- centos7 为使用su命令的用户添加pam授权认证
# 查看用户所属哪个组 groups 用户名 #查看当前有哪些用户运行程序 ps -aux|awk '{print $1}'|sort -rn|uniq -c|sort -rn # 清理不再使用的用户 ...