Java修炼——反射机制
反射机制常见的作用:
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修炼——反射机制的更多相关文章
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- java的反射机制
一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- java笔记--反射机制之基础总结与详解
一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...
- JAVA的反射机制学习笔记(二)
上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...
- java笔录---反射机制(1)
引言 为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架, 像spring中核心模块IO ...
- Java高新技术 反射机制
Java高新技术 反射机制 知识概要: (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...
- java的反射机制浅谈(转)
原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...
- 【转】Java利用反射机制访问私有化构造器
Java利用反射机制访问私有化构造器 博客分类: java 我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...
随机推荐
- ValueError: zero-size array to reduction operation maximum which has no identity
数据打印到第530行之后出现以下异常,求解!
- ActiveMQ消息队列从入门到实践(1)—JMS的概念和JMS消息模型
1. 面向消息的中间件 1.1 什么是MOM 面向消息的中间件,Message Oriented Middleware,简称MOM,中文简称消息中间件,利用高效可靠的消息传递机制进行平台无关的数据交流 ...
- 【原创】使用批处理脚本自动生成并上传NuGet包
Hello 大家好,我是TANZAME,我们又见面了. NuGet 是什么这里就不再重复啰嗦,园子里一搜一大把.今天要跟大家分享的是,在日常开发过程中如何统一管理我们的包,如何通过批处理脚本生成包并自 ...
- 解析XML数据,必看
xml源文件 <?xml version="1.0" encoding="UTF-8"?> <humans> <zhangying ...
- linux 修改IP地址(设置为静态ip)和主机名
主机名: server0.example.com ip地址: 172.25.0.11 网络掩码: 255.255.255.0 默认网关: 172.25.0.254 域名服务器:172.25.254.2 ...
- nyoj 412-Same binary weight (bitset ,to_ulong())
412-Same binary weight 内存限制:64MB 时间限制:0ms 特判: No 通过数:2 提交数:3 难度:3 题目描述: The binary weight of a posit ...
- Android DecorView 与 Activity 绑定原理分析
一年多以前,曾经以为自己对 View 的绘制已经有了解了,事后发现也只是懂了些皮毛而已.经过一年多的实战,Android 和 Java 基础都有了提升,时机成熟了,是时候该去总结 View 的绘制流程 ...
- 【Linux系列】Centos 7安装 Redis(六)
目的 本文主要介绍以下两点: 一. 安装Redis 二. 设置开机启动项 演示 一. 安装Redis 打开Redis官网,右击复制链接. yum install -y gcc # 先更新下编译环境 c ...
- GeoServer 修改端口
准备内容 安装环境:win10*64位专业版 安装文件:geoserver-2.15.2 操作步骤 1.找到文件夹下的start.ini,并用记事本打开 2.找到jetty.port,修改为自己需要的 ...
- oracle中两个服务器连接中sys密码修改问题
问题描述:orcl服务器要连接orclstd 想要sqlplus sys/410526@orclstd as sysdba 连接orclstd数据库,但是发现啥意思密码不对,就对sys密码进行重新设置 ...