您的位置:首页 > 编程语言 > Java开发

java反射抄的例子

2016-06-13 10:17 429 查看
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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: