java反射抄的例子
package com.reflect; import java.lang.reflect.Field;
import java.lang.reflect.Modifier; /*
* 反射的概念
* 指程序可以访问,检测和修改它本身状态或者行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义
* 反射是java中的一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以运行时的装配,无需在组件之间进行源代码链接
*
* 反射机制的作用:
* 1、反编译:.class-->.java
* 2、通过反射机制访问java对象的属性,方法构造等
*
* sun提供的反射机制的类:
* Class
* Constructor
* Field
* Method
* Modifier
*/
public class Study01 { public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchFieldException, InstantiationException, IllegalAccessException {
Study01 s=new Study01();
s.test04();
}
public void test01() throws ClassNotFoundException{
//获取类的三种方法:
Class c1=Class.forName("DVD"); Class c2=ClassDemo.class; ClassDemo c=new ClassDemo();
Class c3=c.getClass();
} public void test02() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
//创建对象,利用newInstance
Class c=Class.forName("DVD"); Object o=c.newInstance();
} public void test03() throws ClassNotFoundException{
//获取整个类
Class c=Class.forName("com.entity.DVD");//注意class.forName()需要类的全名,包括包
//获取所有所有的属性
Field[] fs=c.getDeclaredFields();
//定义可变长的字符串来存储属性
StringBuilder sb=new StringBuilder();
//通过追缴的方法,将每个属性凭借到此字符串中
//最外边的public定义
sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");
//里面的每一个属性
for(Field field:fs){
sb.append("\t");
sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的访问修饰符
sb.append(field.getType().getSimpleName()+" ");//属性的类型名
sb.append(field.getName()+";\n");//属性的名字+回车
}
sb.append("}");
System.out.println(sb);
} public void test04() throws ClassNotFoundException, SecurityException, NoSuchFieldException, InstantiationException, IllegalAccessException{
//获取指定属性
Class c=Class.forName("com.entity.DVD");
Field name=c.getDeclaredField("name");
Object o=c.newInstance();
name.setAccessible(true);//使用反射机制可以打破封装性,导致了java对象的属性不安全
name.set(o, "guo");//给o对象的id赋值“guo"
System.out.println(name.get(o));
} public void test05(){
/*
* 方法关键字:
* getDeclaredMethods() 获取所有方法
* getReturnType() 获取返回值类型
* getParameterTypes() 获取方法的传入参数类型
* getDeclaredMethod("方法名",参数类型.class...) 获得特定方法
*
* 构造关键字:
* getDeclaredConstructors() 获取所有的构造方法
* getDeclaredConstructors(参数类型.class,...)获取特定构造
*
* 父类和接口
* getSuperclass() 获取某类的父类
* getInterfaces() 获取某类实现的接口
*
* 对于java这种先编译后执行的语言来说,反射机制可以使代码更灵活,更加容易实现面向对象 */
}
}
package com.reflect02; import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier; class Study01 {
public static void main(String[] args) {
hello h=new hello();
h.test15();
}
} class Demo{ }
class hello{
/*
* 通过一个对象获取完整的包名和类名
*/
public void test01(){
Demo demo=new Demo();
System.out.println(demo.getClass().getName());
} /*
* 实例化class类对象
*/
public void test02(){
Class<?> demo1=null;
Class<?> demo2=null;
Class<?> demo3=null;
try {
demo1=Class.forName("com.reflect02.Demo");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
demo2=new Demo().getClass();
demo3=Demo.class; System.out.println("类名称 "+demo1.getName());
System.out.println("类名称 "+demo2.getName());
System.out.println("类名称 "+demo3.getName());
}
/*
* 通过无参构造实例化对象
*/
public void test03(){
Class<?> demo=null;
try {
demo=Class.forName("com.reflect02.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Person per=null;
try {
per=(Person) demo.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
per.setName("guo");
per.setAge(12);
System.out.println(per);
} /*
* 调用各种构造创建对象
*/
public void test04(){
Class<?> demo=null;
try {
demo=Class.forName("com.reflect02.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Person per1=null;
Person per2=null;
Person per3=null;
Person per4=null; Constructor<?> cons[]=demo.getConstructors();
// System.out.println(cons[0]);可以先输出找到他们的顺序
// System.out.println(cons[1]);
// System.out.println(cons[2]);
// System.out.println(cons[3]);
//
try {
per2=(Person) cons[0].newInstance((Object)"guo",(Object)12);
per3=(Person) cons[1].newInstance("liu");
per4=(Person) cons[2].newInstance(23);
per1=(Person) cons[3].newInstance(); } catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(per1);
System.out.println(per2);
System.out.println(per3);
System.out.println(per4);
}
/*
* 返回一个类实现的接口
*/
public void test05(){
Class<?> demo=null;
try {
demo=Class.forName("com.reflect02.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Class<?> intes[]=demo.getInterfaces();
for(Class<?> c:intes){
System.out.println("实现的接口:"+c.getName());
}
}
/*
* 取得其他类中的父类
*/
public void test06(){
Class<?> demo=null;
try {
demo=Class.forName("com.reflect02.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Class<?> temp=demo.getSuperclass();
System.out.println("继承的父类为:"+temp.getName());
}
/*
* 获取其他类中全部构造函数
*/
public void test07(){
Class<?> demo=null;
try {
demo=Class.forName("com.reflect02.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Constructor<?> cons[]=demo.getConstructors();
for(Constructor<?> c:cons){
System.out.println(demo.getName()+"的构造方法:"+c);
}
}
/*
* 获取访问权限修饰符
*/
public void test08(){
Class<?> demo=null;
try {
demo=Class.forName("com.reflect02.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Constructor<?> cons[]=demo.getConstructors();
for(int i=0;i<cons.length;i++){
Class<?> p[]=cons[i].getParameterTypes();
System.out.println("构造方法:");
int mo=cons[i].getModifiers();
System.out.print(Modifier.toString(mo)+" ");
System.out.print(cons[i].getName()+"(");
for(int j=0;j<p.length;j++){
System.out.print(p[j].getName()+" arg"+j);
if(j<p.length-1){
System.out.print(",");
}
}
System.out.println("){}");
}
}
/*
* 获取所有方法
*/
public void test09(){
Class<?> demo=null;
try {
demo=Class.forName("com.reflect02.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Method method[]=demo.getMethods();
for(Method m:method){
Class<?> returnType=m.getReturnType();
Class<?> para[]=m.getParameterTypes();
int temp=m.getModifiers();
System.out.print(Modifier.toString(temp)+" ");
System.out.print(returnType.getName()+" ");
System.out.print(m.getName()+" ");
System.out.print("(");
for(int i=0;i<para.length;i++){
System.out.print(para[i].getName()+" arg"+i);
if(i<para.length-1){
System.out.print(",");
}
}
Class<?> exce[]=m.getExceptionTypes();
if(exce.length!=0){
System.out.println(")throws ");
for(int j=0;j<exce.length;j++){
System.out.print(exce[j].getName()+" ");
if(j<exce.length-1){
System.out.print(",");
}
}
}else{
System.out.print(")");
}
System.out.println();
}
}
/*
* 获取其他类的全部属性
*/
public void test10(){
Class<?> demo=null;
try {
demo=Class.forName("com.reflect02.Person1");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println("=================本地属性===================");
Field[] field=demo.getDeclaredFields();
for(int i=0;i<field.length;i++){
//访问权限修饰符
int mo=field[i].getModifiers();
String priv=Modifier.toString(mo);
//属性数据类型
Class<?> type=field[i].getType();
System.out.println(priv+" "+type.getName()+" "+field[i].getName()+";");
} System.out.println("=============实现的接口或父类的属性");
Field[] filed1=demo.getFields();
for(int j=0;j<filed1.length;j++){
//权限修饰符
int mo=filed1[j].getModifiers();
String priv=Modifier.toString(mo);
//属性类型
Class<?> type=filed1[j].getType();
System.out.println(priv+" "+type.getName()+" "+filed1[j].getName()+";"); } }
/*
* 通过反射调用其他类中的方法
*/
public void test11(){
Class<?> demo=null;
try {
demo=Class.forName("com.reflect02.Person1");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
Method method=demo.getMethod("sayChina");
method.invoke(demo.newInstance()); method=demo.getMethod("sayHello",String.class,int.class );
method.invoke(demo.newInstance(), "guo",22);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} }
/*
* 调用其他类的set和get方法
*/
public void test12(){
Class<?> demo=null;
Object obj=null;
try {
demo=Class.forName("com.reflect02.Person1");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
obj=demo.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
setter(obj,"Sex","男",String.class);
getter(obj,"Sex"); }
/*
* 通过反射操作属性
*/
public void test13(){
Class<?> demo=null;
Object obj=null;
try {
demo=Class.forName("com.reflect02.Person1");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
obj=demo.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} try {
Field field=demo.getDeclaredField("sex");
field.setAccessible(true);//允许操作属性
field.set(obj, "男");
System.out.println(field.get(obj));
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
/*
* 通过反射取得并修改数组的信息
*/
public void test14(){
int[] temp={1,2,3,4,5};
Class<?> demo=temp.getClass().getComponentType();
System.out.println("数组类型:"+demo.getName());
System.out.println("数组长度:"+Array.getLength(temp));
System.out.println("数组的第一个元素:"+Array.get(temp, 0));
Array.set(temp, 0, 100);
System.out.println("修改之后数组第一个元素是:"+Array.get(temp, 0));
}
/*
* 通过反射修改数组大小
*/
public void test15(){
int[] temp={1,2,3,4,5,6,7,8,9};
int[] newTemp=(int[]) arrayInc(temp,15);
printA(newTemp);
System.out.println("=======================");
String[] atr={"a","b","c"};
String[] str1=(String[]) arrayInc(atr,8);
printA(str1);
} public Object arrayInc(Object obj,int len){//截取一定长的数组
Class<?> arr=obj.getClass().getComponentType();
Object newArr=Array.newInstance(arr, len);
int co=Array.getLength(obj);
System.out.println(obj);
System.arraycopy(obj,0,newArr,0,co);
return newArr;
}
public void printA(Object obj){//打印数组元素
Class<?> c=obj.getClass();
if(!c.isArray()){
return;
}
System.out.println("数组的长度为:"+Array.getLength(obj));
for(int i=0;i<Array.getLength(obj);i++){
System.out.print(Array.get(obj, i)+" ");
}
}
public void getter(Object obj,String att){
Method method;
try {
method = obj.getClass().getMethod("get"+att);
System.out.println(method.invoke(obj));
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} }
public void setter(Object obj,String att,Object value,Class<?> type){
Method method;
try {
method = obj.getClass().getMethod("set"+att, type);
method.invoke(obj, value);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} } }
class Person{
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person(String name){
this.name=name;
}
public Person(int age){
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
} }
interface China{
public static final String name="guo";
public static int age=20;
public void sayChina();
public void sayHello(String name,int age);
}
class Person1 implements China{
private String sex;
@Override
public void sayChina() {
System.out.println("hello,China");
} @Override
public void sayHello(String name, int age) {
System.out.println("hello,"+name+" "+age);
} public void setSex(String sex) {
this.sex = sex;
} public String getSex() {
return sex;
} @Override
public String toString() {
return "Person1 [sex=" + sex + "name=" + name+ "age=" + age+"]";
} }
package com.reflect02; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class Study02 {
public static void main(String[] args) {
Study02 s=new Study02();
s.test02();
}
/*
* 动态代理
*/
public void test01(){
test t=new test();
System.out.println("类加载器 "+t.getClass().getClassLoader().getClass().getName());
}
/*
* 在java中有三种类加载器
* Bookstrap ClassLoader此加载器采用c++编写,一般在开发中很少见
* Extension ClassLoader用来进行拓展类的加载,一般对应的是jre\lib\ext目录中的类
* AppClassLoader加载classpath指定的类,是罪常用的加载器,同时也是java中的默认加载器
*/
public void test02(){
MyInvocationHandler demo=new MyInvocationHandler();
Subject sub=(Subject) demo.bind(new RealSubject());
String info=sub.say("guo", 22);
System.out.println(info);
}
/*
* 类的生命周期
*
* 在一个类编译完成之后,下一步就需要开始使用类,如果使用一个类,肯定离不来JVM。在程序执行中JVM通过装载,链接,初始化这3个步骤完成。
*
* 类的装载是通过类加载器完成的,加载器将.class文件的二进制文件装入JVM的方法区,并且在堆去创建描述这个类的java.lang.Class对象。用来封装数据。但是同一个类只会被类装载器装载一次
*
* 链接就是把二进制数据组装为可以运行的状态
*
* 链接分为校验,准备,解析这3个阶段
* 校验一般用来确定此二进制文件是否适合当前的JVM(版本)
* 准备就是为静态成员分配内存空间,并设置默认值
* 解析值得是转换常量池中的代码直接作为直接引用的过程,知道所有的符号引用都可以被运行程序使用(建立完整的对应关系)
* 完成之后,类型也就完成了初始化,初始化之后的类的对象就可以正常使用了,看到一个对象不再使用之后,将被垃圾回收。释放空间。
* 当没有任何引用指向class对象时就会被卸载,结束类的生命周期
*/
}
class test{ }
interface Subject{
public String say(String name,int age);
}
class RealSubject implements Subject{ @Override
public String say(String name, int age) {
return name+" "+age;
} }
/*
* 想要完成动态代理,首先需要定义一个InvocationHandler接口的子类,已完成代理的具体操作
*/
class MyInvocationHandler implements InvocationHandler{
private Object obj=null;
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object temp=method.invoke(this.obj,args);
return temp;
} public Object bind(Object obj){
this.obj=obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
.getClass().getInterfaces(), this);
} }
java反射抄的例子的更多相关文章
- java反射使用详细例子
1. 概念 反射,一种计算机处理方式.是程序可以访问.检测和修改它本身状态或行为的一种能力. 2. 反射机制的作用 通过反机制访问java类的属性,方法,构造方法等: 3.反射机制中的类 (1) ja ...
- java反射机制一个例子
import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try ...
- Java反射机制小例子
package com.wjy.main; import java.io.Console; import java.lang.reflect.Constructor; import java.lang ...
- 非常好的Java反射例子
1.Java反射的概念 反射含义:可以获取正在运行的Java对象. 2.Java反射的功能 1)可以判断运行时对象所属的类 2)可以判断运行时对象所具有的成员变量和方法 3)通过反射甚至可以调用到pr ...
- (转)个例子让你了解Java反射机制
个例子让你了解Java反射机制 原文地址:http://blog.csdn.net/ljphhj/article/details/12858767 JAVA反射机制: 通俗地说,反射机制就是可 ...
- 【转】非常好的Java反射例子
转自 http://www.douban.com/note/306848299/ 原文: 1.Java反射的概念 反射含义:可以获取正在运行的Java对象. 2.Java反射的功能 1)可以判断运行时 ...
- 一个例子让你了解Java反射机制
本文来自:blog.csdn.net/ljphhj JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运 ...
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
随机推荐
- 验证APNS证书的有效性
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert xxx.pem
- [CLR via C#读后整理]-1.CLR的执行模型
公共语言运行时(Common Language Runtime,CLR)是一个可由多种编程语言使用的"运行时".他主要提供的功能有:程序集加载,内存管理,,安全性,异常处理,线程同 ...
- jquery的prev选择器无效
今天使用jquery操作dom 需要把当前元素的同级元素中前面带有属性a=1的元素筛选出来. 查看api, .prev() 获得匹配元素集合中每个元素紧邻的前一个同辈元素,由选择器筛选(可选). 看 ...
- 设置oracle编辑的快捷方式
打开PLSQL Developer: 中文版:[工具]-->[首选项]-->[用户界面]-->[编辑器],在右侧界面往下拉找到[自动替换],点击[编辑],就可以自定义想要的快捷方式了 ...
- fastdfs安装与配置
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载体的在线服务,如相 ...
- 20135320赵瀚青LINUX第二章读书笔记
第二章-从内核出发 获取内核代码 使用git 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/tor ...
- linux安全第一周总结——20135227黄晓妍
实验部分: 我将源代码做了修改,将其中一个数字修改为我学号27 2.在实验楼环境下将其保存为text.c并将其编译,得到text.s 3.将.开头的多余的语句删去了之后,我得到了32位环境的汇编代码 ...
- Mysql MariaDB安装
1.安装 本人使用的是CentOS 7 ,默认yum安装,但默认yum安装版本有点低,可根据需要选择升级,我这里选择先升级再安装. 更新yum //更新yum包 yum -y update 配置yum ...
- C语言一些总结
预处理#include<stdio.h>:头文件. stdio.h 标准输入输出. string.h 字符串预处理,. int main()主函数,返回的是int整型, return 0; ...
- 2017ACM/ICPC广西邀请赛-重现赛 1001 A Math Problem
2017-08-31 16:48:00 writer:pprp 这个题比较容易,我用的是快速幂 写了一次就过了 题目如下: A Math Problem Time Limit: 2000/1000 M ...