反射机制常见的作用:

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. 如何在HTML中设置字体颜色,你知道这几种方式吗?

    color设置字体颜色 在color设置字体颜色之前,我们首先了解color在CSS中有几种取值方式,一共有4种方式,若有不全还请在评论区告知谢谢,4种方式如下: 十六进制.十进制. 英文单词.十六进 ...

  2. css3关于body的默认滑动机制

    css关于body的默认滑动机制 大家都知道 body里面只要高度超出了原来的高度就可以滚动要取消这个机制 只能设置height:100% overflow:hidden就能取消了

  3. hdu 1251 统计难题 (字典树(Trie)<PS:C++提交不得爆内存>)

    统计难题Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submis ...

  4. 力扣(LeetCode)种花问题 个人题解

    假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有.可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去. 给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花 ...

  5. Jmeter使用代理录制web

    Jmeter有录制功能,录制HTTPs需要增加一个证书配置,录制步骤如下: 1.打开jmeter,添加线程组.线程组右键,逻辑控制器>录制控制器 工作台 右键 非测试元件 >HTTP代理服 ...

  6. Python爬虫的开始——requests库建立请求

    接下来我将会用一段时间来更新python爬虫 网络爬虫大体可以分为三个步骤. 首先建立请求,爬取所需元素: 其次解析爬取信息,剔除无效数据: 最后将爬取信息进行保存: 今天就先来讲讲第一步,请求库re ...

  7. 使用CGLIB实现动态代理

    参考:https://blog.csdn.net/yhl_jxy/article/details/80633194#comments CGLIB动态代理 定义:CGLIB(code genaratio ...

  8. JSON——IT技术人员都必须要了解的一种数据交换格式

    JSON作为目前Web主流的数据交换格式,是每个IT技术人员都必须要了解的一种数据交换格式.尤其是在Ajax和REST技术的大行其道的当今,JSON无疑成为了数据交换格式的首选! 今天大家就和猪哥一起 ...

  9. C# 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”

    “Microsoft.Jet.OLEDB.4.0” 是数据库接口驱动,用来连接数据库的,一般多用于连Access和Excel.我在在winform开发时,在本地运行没有问题,可是部署到另一台服务器上就 ...

  10. [FPGA]Verilog利用PWM调制巧妙完成RGB三色彩虹呼吸灯(给简约的题目以美妙的解答)

    概述 实现彩虹呼吸灯 题目就是这么简短,但这是目前我碰到的最有意思的一道题目,因为他有无数种解决方法,并且每一种都是那么高级或者巧妙,比如 可以利用3路不同初相的PWM调制信号驱动三颗RGB灯重叠呼吸 ...