反射机制常见的作用:

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. mpvue+小程序云开发,纯前端实现婚礼邀请函

    请勿使用本文章及源码作为商业用途! 前言 当初做这个小程序是为了婚礼前的需要,结婚之后,希望这个小程序能够留存下来,特地花了一些空闲时间将小程序转化成为“相册类小程序” 体验码 准备工作 mpvue框 ...

  2. PHP failed to ptrace(PEEKDATA) pid 13659: Input/output error错误解决方法

    PHP failed to ptrace(PEEKDATA) pid 13659: Input/output error错误解决方法 现在改linux内核文件打开限制<pre>ulimit ...

  3. China .NET Conf 2019-.NET技术架构下的混沌工程实践

    这个月的8号.9号,个人很荣幸参加了China.NET Conf 2019 , 中国.NET开发者峰会,同时分享了技术专题<.NET技术架构下的混沌工程实践>,给广大的.NET开发小伙伴介 ...

  4. 推荐Java五大微服务器及其代码示例教程

    来源素文宅博客:http://blog.yoodb.com/yoodb/article/detail/1339 微服务越来越多地用于开发领域,因为开发人员致力于创建更大,更复杂的应用程序,这些应用程序 ...

  5. 网站搭建-windows 系统 本地 网站搭建 - IIS

    上一章有提到IIS安装,现在打开它: 点击浏览,如果没有启动的话,先点击启动. ip先选好,第一个吧,本机的(IIS自己提供了初始网页的东西). 然后可以自己去https://www.freemoba ...

  6. PHP 在Swoole中使用双IoC容器实现无污染的依赖注入

    简介: 容器(container)技术(可以理解为全局的工厂方法), 已经是现代项目的标配. 基于容器, 可以进一步实现控制反转, 依赖注入. Laravel 的巨大成功就是构建在它非常强大的IoC容 ...

  7. ESP 8266 引脚图

    ESP 8266 引脚图  

  8. nyoj 241-字母统计 (python count)

    241-字母统计 内存限制:64MB 时间限制:3000ms 特判: No 通过数:12 提交数:14 难度:1 题目描述: 现在给你一个由小写字母组成字符串,要你找出字符串中出现次数最多的字母,如果 ...

  9. win10添加启动项目

    Win10启动文件夹一般位于C:\ProgramData\Microsoft\Windows\Start Menu(开始菜单)\Programs(程序)\StartUp(启动)目录,我们主要讲希望添加 ...

  10. ehcache监控

    引入Maven依赖 <dependency> <groupId>org.terracotta.ehcachedx.com.javabi</groupId> < ...