反射机制常见的作用:

1) 动态的加载类、动态的获取类的信息(属性,方法,构造器)

2) 动态构造对象

3) 动态调用类和对象的任意方法、构造器

4) 动态调用和处理属性

5) 获取泛型信息

6) 处理注解

先创建一个User类:

package com.bjsxt.entity;

public class User {
private int uid;
public String name;
private String password;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
//构造方法
public User(int uid, String name, String password) {
super();
this.uid = uid;
this.name = name;
this.password = password;
}
public User() {
super();
} }

获取Class对象的三种方法:

1) 通过字节码文件

2) 对象的 getClass()方法

3) Class 类的静态方法 forName(….)

package com.bjsxt.reflect;

import com.bjsxt.entity.User;

public class TestGetClass {
public static void main(String[] args) throws ClassNotFoundException {
System.out.println("获取intClass对象:"+int.class);
System.out.println("获取voidClass对象:"+void.class); int [] arraya=new int[20];
int [] arrayb=new int[30];
double [] arrayc=new double[30];
/**维数相同和类型相同共享同一个Class对象*/
// System.out.println(arrayc.getClass()==arrayb.getClass());//报错
System.out.println("arraya和arrayb是否是同一个Class对象:"+(arraya.getClass()==arrayb.getClass())); //创建User类的对象
/**同一个类N多个对象,共享同一个Class对象*/
User user1=new User(1001, "李四", "123");
User user2=new User(1002, "李思", "125");
System.out.println("user1和user2是否是同一个Class对象:"+(user1.getClass()==user2.getClass())); //获取Class的三种方式 //1.通过对象的getClass()获取
Class c1=user1.getClass();
//2.通过字节码文件获取
Class c2=User.class;
//3.通过Class类的静态方法获取
Class c3=Class.forName("com.bjsxt.entity.User"); System.out.println((c1==c2)+"\t"+(c2==c3));
}
}

反射机制动态操作方法_属性_构造器:

       获取类名的方法:

1  String getName()  获得包名+类名

2  String getSimpleName() 获得类的名字

获取属性对象的方法

1  Field getField(String fieldName)  得到公共的属性对象

2  Field getDeclareField(String fieldName)  得到指定名称的属性对象

3  Field []c.getDeclaredFields()  得到所有的属性对象

获取方法以及构造方法:

1  Method[] getDeclaredMethods()  得到公共的方法对象

2  Method[] c.getMethods()  得到父类及本类中的公共的方法对象

3  Method  getDeclaredMethod(String methodName, Class …type)得到指定名称的本类中公共的方法

4  Method  getMethod(String  methodName,Class type)得到本类或父类中的公共的方法对象

1  Constructor[] getDeclaredConstructors()  得到公共的构造方法的对象

2  Constructor [] getConstructors()  得到公共的构造方法对象

3  ConstructorgetDeclaredConstructor(Class...type)得到指定参数的公共的构造方法对象

package com.bjsxt.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method; public class TestDongTai {
final public static String path="com.bjsxt.entity.User";//完全是为了后面写代码的方便
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, NoSuchMethodException {
//1.获取类的名称
System.out.println("\n********************获取类的名称*****************");
Class c=Class.forName(path);
System.out.println("获取类的全名(包名和类名):"+c.getName());
System.out.println("获取类的名字:"+c.getSimpleName()); //获取父类的Class对象
Class csuper=c.getSuperclass();
System.out.println("\n获取父类的全名(包名和类名):"+csuper.getName());
System.out.println("获取父类的名字:"+csuper.getSimpleName()); //2.获取类的属性信息
System.out.println("\n********************获取类的属性信息*****************");
// Field fid = c.getField("uid");
Field fname = c.getField("name");
// System.out.println("获取类的公共属性:"+fid);//错误,因为id是私有的。
System.out.println("获取类的公共属性:"+fname);//public java.lang.String com.bjsxt.entity.User.name
System.out.println("\n");
Field[] fields = c.getFields();//获取类的所有公共属性
for (Field field : fields) {
System.out.println("获取类的所有公共属性:"+field);
}
Field[] fs = c.getDeclaredFields();//获取类的所有属性
for (Field fis : fs) {
// System.out.println("获取类的所有属性:"+fis);//重写tostring方法
/**访问级别:public 1; private 2; protected 4;*/
System.out.println("获取级别:"+fis.getModifiers()+"\t获取类型:"+fis.getType()+"\t获取属性名字:"+fis.getName()); } //3.获取类的方法信息
System.out.println("\n********************获取类的方法信息*****************");
Method[] ms = c.getDeclaredMethods();//获得本类中的所有方法对象
System.out.println("本类有多少个方法:"+ms.length);
for (Method method : ms) {
// System.out.println(method);
System.out.println("访问权限:"+method.getModifiers()+"\t方法返回值类型:"+method.getReturnType()+"\t方法名称:"+method.getName());
Class[] pt = method.getParameterTypes();
for (Class c1 : pt) {
System.out.println("方法参数:"+c1.getTypeName()+"\t");
}
System.out.println("\n***********************");
} //4.类的获取构造方法
System.out.println("\n******************类的获取构造方法************************");
Constructor[] cs = c.getConstructors();
System.out.println("获取所有的构造方法:");
for (Constructor constructor : cs) {
System.out.println(constructor);
}
System.out.println("\n获取无参构造方法:");
Constructor cnull = c.getConstructor(null);
System.out.println(cnull);
System.out.println("\n获取有参构造方法:");
Constructor con = c.getConstructor(int.class,String.class,String.class);
System.out.println(con);
}
}

运行结果 :

提高反射效率:

通过 setAccessible 提高性能

a) setAccessible 启用和禁用访问安全检查的开关,值为true 则指示反射的对 象在使用时应该取消 Java 语言访问检查,值为 false 则指示反射的对象不 实施Java 语言访问检查,并不是为 true 就能访问为 false 就不能访问

b) 禁止安全检查,可以提高反射的运行速度

Java修炼——反射机制的更多相关文章

  1. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  2. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  3. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  4. java笔记--反射机制之基础总结与详解

    一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...

  5. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  6. java笔录---反射机制(1)

    引言   为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架,   像spring中核心模块IO ...

  7. Java高新技术 反射机制

     Java高新技术 反射机制 知识概要:                   (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...

  8. java的反射机制浅谈(转)

    原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...

  9. 【转】Java利用反射机制访问私有化构造器

    Java利用反射机制访问私有化构造器 博客分类: java   我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...

随机推荐

  1. Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)

    简介 经过一段时间的准备,完善的差不多了,继续分享有关Appium自动化测试框架综合实践.想必小伙伴们有点等不及了吧! driver配置封装 kyb_caps.yaml 配置表 参考代码 platfo ...

  2. [ PyQt入门教程 ] PyQt5中数据表格控件QTableWidget使用方法

    如果你想让你开发的PyQt5工具展示的数据显得整齐.美观.好看,显得符合你的气质,可以考虑使用QTableWidget控件.之前一直使用的是textBrowser文本框控件,数据展示还是不太美观.其中 ...

  3. 简单看看@RequestBody注解原理

    又到了很无聊的时候了,于是随便看看源码假装自己很努力的样子,哈哈哈: 记得上一篇博客随便说了一下RequestBody的用法以及注意的问题,这个注解作为非常常用的注解,也是时候了解一波其中的原理了. ...

  4. 源码学习系列之SpringBoot自动配置(篇二)

    源码学习系列之SpringBoot自动配置(篇二)之HttpEncodingAutoConfiguration 源码分析 继上一篇博客源码学习系列之SpringBoot自动配置(篇一)之后,本博客继续 ...

  5. JavaScript 弹出框:警告(alert)、确认(confirm)的简单写法

    onclick="javascript:return window.confirm('message')"

  6. runlevel init

    init概念存在于cnetos7以下,配置文件/etc/inittab init 以及 文本和图形界面切换(可以用ctrl+alt+n 或者 init3 5切换,不是重启切) 命令init N 0 关 ...

  7. window系统下删除多余的引导

    window系统下删除多余的引导 1.首先第一步进入EFI分区删除多余系统引导,只留下需要的引导 如何进入EFI分区 a)win 搜索框输入cm, 右键以管理员运行命令行 b)输入命令 diskpar ...

  8. tornado install

    pip install tornado Linux 安装时注意库的安装路径和执行时寻找路径是否一样 Windows 安装时注意user是否有权限 解决办法:

  9. 20191017-6alpha week 2/2 Scrum立会报告+燃尽图 05

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9802 一.小组情况 队名:扛把子 组长:迟俊文 组员:宋晓丽 梁梦瑶 韩昊 ...

  10. mysql安装与sqlyog安装

    首先是mysql安装,参考下面两个链接 https://www.cnblogs.com/gengyufei/p/11735358.html#_label4 https://www.jb51.net/a ...