反射机制常见的作用:

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. DFS深度优先算法学习

    刚开始学习算法,参考大佬博客还是有很多不明白的,于是一步步解析,写下笔记记录. 大佬博客地址: https://blog.csdn.net/fuzekun/article/details/852204 ...

  2. (Codeforce)The number of positions

    Petr stands in line of n people, but he doesn't know exactly which position he occupies. He can say ...

  3. 关于css中的字体样式

    1.决定字体的属性 color:字体颜色  属性值:单词,十六进制表示,rgb 2.字体大小 font-size:12px:属性值是整数字,不要带小数,单位是px叫做像素单位:凡是由像素拼成的图片我们 ...

  4. Python3.7.1学习(一):redis的连接和简单使用

    1.python 利用 redis 第三方库 首先安装:pip install redis 2.reids的连接 Redis使用StrictRedis对象来管理对一个redis server 的所有连 ...

  5. 领扣(LeetCode)单词模式 个人题解

    给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式. 这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向 ...

  6. Unix, Linux以及NT内核和它们各自衍生的系统关系图

  7. sql注入基本原理

    SQL注入基本原理 WEB技术发展日新月异,但是徒手拼SQL的传统手艺还是受相当多的开发者亲睐.毕竟相比于再去学习一套复杂的ORM规则,手拼更说方便,直观.通常自己拼SQL的人,应该是有听说过SQL注 ...

  8. vue路由传参刷新丢失

    没有系统学习过vue,以前使用路由传参都是直接this.$router.push({name:'main',params:{'id': 123}})的,没有在路由定义中配置参数,如下: router: ...

  9. Swoft源码之Swoole和Swoft的分析

    这篇文章给大家分享的内容是关于Swoft 源码剖析之Swoole和Swoft的一些介绍(Task投递/定时任务篇),有一定的参考价值,有需要的朋友可以参考一下. 前言 Swoft的任务功能基于Swoo ...

  10. 【Flink】Flink基础之WordCount实例(Java与Scala版本)

    简述 WordCount(单词计数)作为大数据体系的标准示例,一直是入门的经典案例,下面用java和scala实现Flink的WordCount代码: 采用IDEA + Maven + Flink 环 ...