java反射 之 反射基础
一、反射
反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
*b、java.lang.reflect.Constructor<T>:操作类的够造函数。
*c、java.lang.reflect.Method:操作类的方法。
package com.jalja.org.base.relfect; public class Person {
private String name;
int age;
public String address; public Person() {
} private Person(String name) {
this.name = name;
} Person(String name, int age) {
this.name = name;
this.age = age;
} public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
} public void show() {
System.out.println("show");
} public void method(String s) {
System.out.println("method " + s);
} public String getString(String s, int i) {
return s + "---" + i;
} private void function() {
System.out.println("function");
} @Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", address=" + address
+ "]";
} }
二、获取类的Class对象
public static void getClassObject() throws ClassNotFoundException{
//方式一:Object的getClass()方法
Person person1=new Person();
Person person2=new Person();
Class c1=person1.getClass();
Class c2=person2.getClass();
System.out.println(person1==person2);//false
System.out.println(c1==c2);//true 不管JVM内存中有多少个对象,对于字节码文件来说只有一份
//方式二:数据类型的静态class属性
Class c3=Person.class;
System.out.println(c1==c3);//true
//方式三:Class 类的静态方法
//public static Class<?> forName(String className)throws ClassNotFoundException
Class c4=Class.forName("com.jalja.org.base.relfect.Person");
System.out.println(c1==c4);//true
}
三、java.lang.reflect.Constructor<T>:对象并使用Constructor类。
1、获取Constructor对象
//获取Class 对象所表示的类的构造方法
public static void getConstructorTest() throws Exception{
Class c4=Class.forName("com.jalja.org.base.relfect.Person");
//1、获取Class 对象所表示的类所有公共构造方法
//public Constructor<?>[] getConstructors() throws SecurityException
Constructor [] cs=c4.getConstructors();
//2、获取Class 对象所表示的类所有构造方法
//public Constructor<?>[] getDeclaredConstructors() throws SecurityException
Constructor[] cs2 =c4.getDeclaredConstructors();
//3、获取Class对象所表示类的指定指定公共构造方法, parameterTypes 参数是 Class 对象的一个数组 ,是指定数据类型的字节码
//public Constructor<T> getConstructor(Class<?>... parameterTypes);
Constructor cs3=c4.getConstructor();//获取公共的无参构造方法的Constructor对象
//获取 该 构造函数 public Person(String name, int age, String address)
Constructor cs4=c4.getConstructor(String.class,int.class,String.class);
//4、获取Clss对象所表示类指定的构造范法官 parameterTypes 参数是 Class 对象的一个数组,它按声明顺序标识构造方法的形参类型的字节码。
//public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes);
//获取该构造 函数 private Person(String name) 的Constructor对象
Constructor cs5=c4.getDeclaredConstructor(String.class); }
2、通过 Constructor 对象创建Class对象所表示类的实例
public static void createObject() throws Exception{
Class c4=Class.forName("com.jalja.org.base.relfect.Person");
//使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例
//public T newInstance(Object... initargs);
// Person person=new Person()
Constructor cs3=c4.getConstructor();//获取公共的无参构造方法的Constructor对象
Object obj=cs3.newInstance(); //Person person=new Person("jalja", 21, "北京");
Constructor cs4=c4.getConstructor(String.class,int.class,String.class);
Object obj1=cs4.newInstance("jalja",21,"北京");
System.out.println(obj1);//Person [name=jalja, age=21, address=北京] //实例化一个私有的构造函数 private Person(String name)
//控制java的访问检查
//public void setAccessible(boolean flag)
//将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
//值为 false 则指示反射的对象应该实施 Java 语言访问检查。
Constructor cs5=c4.getDeclaredConstructor(String.class);
cs5.setAccessible(true);
Object obj2=cs5.newInstance("张三丰");
System.out.println(obj2);//Person [name=张三丰, age=0, address=null]
}
四、java.lang.reflect.Field
1、获取Field对象
//获取Class类的Field对象
public static void getFieldTest() throws Exception{
Class cs=Class.forName("com.jalja.org.base.relfect.Person");
//1、public Field[] getFields() throws SecurityException
//获取Class 对象所表示的类或接口的所有可访问公共(public修饰的)字段
Field [] fs=cs.getFields();
//2、public Field[] getDeclaredFields() throws SecurityException
// 获取Class 对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段
Field [] fs1=cs.getDeclaredFields();
//3、public Field getField(String name)throws NoSuchFieldException, SecurityException;
//获取Class 对象所表示的类或接口的指定公共成员(public修饰)字段。name 参数是一个 String,用于指定所需字段的简称
Field fs2=cs.getField("address");
//public Field getDeclaredField(String name) throws NoSuchFieldException,SecurityException
//获取 Class 对象所表示的类或接口的指定已声明字段。name 参数是一个 String,它指定所需字段的简称
Field fs3=cs.getDeclaredField("name");
System.out.println(fs3);
}
2、通过Field对象对指定类属性赋值
//使用 Field对象
public static void createVarValue() throws Exception{
Class cs=Class.forName("com.jalja.org.base.relfect.Person");
Object obj=cs.getConstructor().newInstance();
Field addressField=cs.getField("address");
//public void set(Object obj, Object value);
//将指定对象变量上此 Field 对象表示的字段设置为指定的新值。如果底层字段的类型为基本类型,则对新值进行自动解包
//obj - 应该修改其字段的对象 value - 正被修改的 obj 的字段的新值
addressField.set(obj, "北京");
System.out.println(obj); //Person [name=null, age=0, address=北京] //对非public修饰的变量操作
Field nameField=cs.getDeclaredField("name");
//控制java的访问检查
nameField.setAccessible(true);
nameField.set(obj, "张三丰");
System.out.println(obj);//Person [name=张三丰, age=0, address=北京]
}
五、java.lang.reflect.Method
1、获取Method对象
//获取Method对象
public static void getMethodTest() throws Exception{
Class cs=Class.forName("com.jalja.org.base.relfect.Person");
//1、public Method[] getMethods() throws SecurityException
//获取Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
Method [] m1=cs.getMethods();
//2、public Method[] getDeclaredMethods() throws SecurityException
//获取Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法
Method [] m2=cs.getDeclaredMethods();
//3、public Method getMethod(String name, Class<?>... parameterTypes)throws NoSuchMethodException, SecurityException;
// 获取Class 对象所表示的类或接口的指定公共成员方法。name 参数是一个 String,用于指定所需方法的简称。parameterTypes 参数是按声明顺序标识该方法形参类型的 Class 对象的一个数组
Method m3=cs.getMethod("show");//无参的方法
Method m4=cs.getMethod("method",String.class);//带参的方法
//public Method getDeclaredMethod(String name, Class<?>... parameterTypes)throws NoSuchMethodException,SecurityException
// Class 对象所表示的类或接口的指定已声明方法。name 参数是一个 String,它指定所需方法的简称,parameterTypes 参数是 Class 对象的一个数组
Method m5=cs.getDeclaredMethod("function");//无参的方法
System.out.println(m5);
}
2、通过Method对象调用指定类的方法
// Method对象的使用
public static void createMethod() throws Exception{
Class cs=Class.forName("com.jalja.org.base.relfect.Person");
Object obj=cs.getConstructor().newInstance();
Method m3=cs.getMethod("show");//无参的方法
//public Object invoke(Object obj,Object... args)
//对带有指定参数的指定对象调用由此 Method 对象表示的底层方法 obj - 从中调用底层方法的对象 args - 用于方法调用的参数
m3.invoke(obj);
//对带参方法的操作
Method m4=cs.getMethod("method",String.class);//带参的方法
m4.invoke(obj,"北京");
//对有返回值得方法操作
Method m6=cs.getMethod("getString",String.class,int.class);//带参的方法
Object str=m6.invoke(obj,"北京",200);
System.out.println(str);
//对私有无参方法的操作
Method m5=cs.getDeclaredMethod("function");
m5.setAccessible(true);
m5.invoke(obj);
}
六、反射操作注解
@ClassAnnotation("tb_person")
public class Person {
@FieldAnnotation(name="table_name",length=32,type="varchar")
private String name;
@FieldAnnotation(name="table_age",length=3,type="int")
private int age;
@FieldAnnotation(name="table_address",length=32,type="varchar")
public String address;
....get;
....set;
}
//注解类
@Target(value={ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldAnnotation {
String name();
int length();
String type();
}
//注解类
@Target(value={ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ClassAnnotation {
String value();
}
//Annotation
public static void createAnnotation() throws Exception{
Class cs=Class.forName("com.jalja.org.base.relfect.Person");
//获取该类的所有注解
Annotation[] as= cs.getAnnotations();
//获取该类指定类型的注解 //@com.jalja.org.base.relfect.ClassAnnotation(value=tb_person)
ClassAnnotation at=(ClassAnnotation) cs.getAnnotation(ClassAnnotation.class);
//获取该注解设置的值
String an_value=at.value();//tb_person //获取类 name属性(Field)的注解类型
FieldAnnotation fieldName=cs.getDeclaredField("name").getAnnotation(FieldAnnotation.class);
//获取注解值 #table_name--32--varchar
System.out.println(fieldName.name()+"--"+fieldName.length()+"--"+fieldName.type());
}
java反射 之 反射基础的更多相关文章
- 【转】Java反射 之 反射基础
一.反射 反射:Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- java Reflection(反射)基础知识讲解
原文链接:小ben马的java Reflection(反射)基础知识讲解 1.获取Class对象的方式 1.1)使用 "Class#forName" public static C ...
- Java进阶之reflection(反射机制)——反射概念与基础
反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...
- 【Java基础】java中的反射机制与动态代理
一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...
- Java反射概念与基础
反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...
- 浅说Java中的反射机制(二)
写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...
- Java---类反射(1)---类反射入门和基础
什么是类反射 ☆什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方 ...
- 4 Java学习之 反射Reflection
1. 反射概念 反射机制就是:动态地获取类的一切信息,并利用这些信息做一些你想做的事情. java反射机制能够知道类名而不实例化对象的状态下,获得对象的属性或调用方法. JAVA反射机制是在运行状态 ...
- java中的反射整理
1,什么是反射 反射机制是java语言提供的一种基础功能,它能够赋予成语在运行时进行自省的能力.通过反射我们可以直接操作类或者对象,例如:可以通过反射去获取某个对象的类的定义,属性,方法,还可以修改类 ...
随机推荐
- Vue - 自定义指令
1.Vue.directive(id,definition)注册一个全局自定义指令,接收两个参数,指令ID以及定义对象 2.钩子函数:将作用域与DOM进行链接,链接函数用来创建可以操作DOM的指令 b ...
- HDU4787 GRE Words Revenge(AC自动机 分块 合并)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4787 Description Now Coach Pang is preparing for ...
- 2016-2-10 tomcat基础学习
安装tomcat服务器(1)配置 JAVA_HOME指向你的jdk主目录 也可以在startup.bat文件中设置JAVA_HOME环境变量. 首次使用JAVA_HOME前设置即可.set JAVA_ ...
- js动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- BZOJ2498 : Xavier is Learning to Count
考虑容斥,通过$Bell(p)$的时间枚举所有等价情况. 对于一种情况,强制了一个等价类里面的数都要相同,其它的可以相同也可以不同. 这方案数显然可以通过多项式乘法求得,乘上容斥系数$(-1)^{p- ...
- CI框架代码运行最详细的流程
最近在学习CI(3.1.0-dev)框架源码,一边看源码,一边在github上面写中文注释,https://github.com/pandancode/CI-note,有兴趣的同学可以看看. inde ...
- xcode8 升级后注释快键键不能使用的解决方法
1.这个是因为苹果解决xcode ghost.把插件屏蔽了.解决方法 命令运行: sudo /usr/libexec/xpccachectl 然后必须重启电脑后生效 2.option+command ...
- Salesforce入门学习介绍
大家好,本人作为重庆德勤2016年的实习生,进公司实习后有幸接触到了Salesforce,通过一个多月的自学以及培训,准备和大家分享一下我的Salesforce学习之路. 一.什么是Salesforc ...
- windows下python的tar.gz文件安装
windows下下载了django,PIL,web.py发现都是tar.gz格式的文件,网上查找也非常系统的方法,总结一下其他大神的方法,归纳于此. 首先下载tar.gz文件,比如web.py,下载后 ...
- 《HTTP权威指南》大块儿头
看到这样的一本书,胡乱翻开看看里面的内容,我觉得我又浮躁了.真厚啊!能学多少就学多少吧. 看看提要,这本书主要想讲的是HTTP和相关Web技术的.关于这方面的内容,知道的不多.