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);
    }

}
时间: 2024-07-28 16:00:02

java反射抄的例子的相关文章

java反射机制一个例子

import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try { Class c = Class.forName("java.util.Stack"); Method m[] = c.getDeclaredMethods(); for (int i = 0; i < m.length; i++) System.out.println(m[i].

从java 反射看延迟加载(代理模式)(一)

先看一下网络上关于java 反射的小例子-- [案例1]通过一个对象获得完整的包名和类名 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package Reflect; /**  * 通过一个对象获得完整的包名和类名  * */ class Demo{     //other codes... } class hello{     public static void main(String[] args) {         Demo demo=new Demo();

java反射机制例子,反编译,以及通过读取配置文件降低耦合

本文不多做文字描述,通过代码可以说明一切,简单直观. //这边以反编译String类为例子,将反编译结果输入到文件. 1.ReflectTest.java 1 import java.io.File; 2 import java.io.FileReader; 3 import java.io.FileWriter; 4 import java.lang.reflect.Constructor; 5 import java.lang.reflect.Field; 6 import java.lan

java反射小例子

package com.txwsqk.reflect; public class Car { private String brand; private String color; private int maxspeed; public Car(){} public Car(String brand, String color, int maxspeed){ this.brand = brand; this.color = color; this.maxspeed = maxspeed; }

非常好的Java反射例子

1.Java反射的概念 反射含义:可以获取正在运行的Java对象. 2.Java反射的功能 1)可以判断运行时对象所属的类 2)可以判断运行时对象所具有的成员变量和方法 3)通过反射甚至可以调用到private的方法 4)生成动态代理 3.实现Java反射的类 1)Class:它表示正在运行的Java应用程序中的类和接口 2)Field:提供有关类或接口的属性信息,以及对它的动态访问权限 3)Constructor:提供关于类的单个构造方法的信息以及对它的访问权限 4)Method:提供关于类或

【转】非常好的Java反射例子

转自 http://www.douban.com/note/306848299/ 原文: 1.Java反射的概念 反射含义:可以获取正在运行的Java对象. 2.Java反射的功能 1)可以判断运行时对象所属的类 2)可以判断运行时对象所具有的成员变量和方法 3)通过反射甚至可以调用到private的方法 4)生成动态代理 3.实现Java反射的类 1)Class:它表示正在运行的Java应用程序中的类和接口 2)Field:提供有关类或接口的属性信息,以及对它的动态访问权限 3)Constru

Java反射的例子

1.Java反射的概念 反射含义:可以获取正在运行的Java对象. 2.Java反射的功能 1)可以判断运行时对象所属的类 2)可以判断运行时对象所具有的成员变量和方法 3)通过反射甚至可以调用到private的方法 4)生成动态代理 3.实现Java反射的类 1)Class:它表示正在运行的Java应用程序中的类和接口 2)Field:提供有关类或接口的属性信息,以及对它的动态访问权限 3)Constructor:提供关于类的单个构造方法的信息以及对它的访问权限 4)Method:提供关于类或

java反射机制学习笔记及例子代码

Java 反射的API 反射中常常用的几个类如下所示: java.lang 包中: --Class 类:代表一个类 Java 中,无论生成某个类的多少个对象,这些对象都会对应同一个 Class 对象 Java.lang.reflect 包中: --Field 类:代表类的成员变量(类的属性) --Method 类:代表类的方法,一个方法对应一个 Method 对象 --Constructor 类:代表类的构造方法 --Array 类:提供动态创建数组,以及访问数组的元素的静态方法 利用反射机制调

Java学习(一):反射的简单例子

Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法. public class JavaTest { public static void main(String[] args) { try { Class myClass = Class.forName("Student"); Object student = (Object)myClass.newInsta