当前位置: 亚洲城ca88 > ca88 > 正文

反射工具类,Java学习笔记

时间:2019-06-06 23:08来源:ca88
package com.su.dolphin.utils;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;/** * * @className: Reflectio
package com.su.dolphin.utils;

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;

/**
 * 
 * @className: ReflectionUtil
 * @description: 反射工具类
 * @author: gaoshuai
 * @date: 2015年8月5日 下午4:51:49
 */
public class ReflectionUtil
{
    /**
     * 
     * @title: setField
     * @description: 设置某个成员遍历的值
     * @param owner
     * @param fieldName
     * @param value
     * @throws Exception
     * @return: void
     */
    public static void setField(Object owner, String fieldName, Object value) throws Exception {
        Class<?> ownerClass = owner.getClass();
        Field field = ownerClass.getDeclaredField(fieldName);
        field.setAccessible(true);
        field.set(owner, value);
    }

    /**
     * 
     * @title: setFieldAll
     * @description: 可以设置父类的field的值
     * @param owner
     * @param fieldName
     * @param value
     * @throws Exception
     * @return: void
     */
    public static void setFieldAll(Object owner, String fieldName, Object value) throws Exception {
        Class<?> ownerClass = owner.getClass();
        Field field = null;
        for (Class<?> clazz = ownerClass; clazz != Object.class; clazz = clazz.getSuperclass()) {
            try {
                field = clazz.getDeclaredField(fieldName);
                LogUtil.d(field   " find : in "   clazz.getName());
                break;
            }
            catch (Exception e) {
                LogUtil.d(fieldName   " not find in "   clazz.getName());
            }
        }
        field.setAccessible(true);
        field.set(owner, value);
    }

    /**
     * 得到某个对象的公共属性
     * 
     * @param owner
     *            , fieldName
     * @return 该属性对象
     * @throws Exception
     * 
     */
    public static Object getField(Object owner, String fieldName) throws Exception {
        Class<?> ownerClass = owner.getClass();

        Field field = ownerClass.getField(fieldName);

        Object property = field.get(owner);

        return property;
    }

    /**
     * 得到某类的静态公共属性
     * 
     * @param className
     *            类名
     * @param fieldName
     *            属性名
     * @return 该属性对象
     * @throws Exception
     */
    public static Object getStaticField(String className, String fieldName) throws Exception {
        Class<?> ownerClass = Class.forName(className);

        Field field = ownerClass.getField(fieldName);

        Object property = field.get(ownerClass);

        return property;
    }

    /**
     * 执行某对象方法
     * 
     * @param owner
     *            对象
     * @param methodName
     *            方法名
     * @param args
     *            参数
     * @return 方法返回值
     * @throws Exception
     */
    public static Object invokeMethod(Object owner, String methodName, Object... args) throws Exception {

        Class<?> ownerClass = owner.getClass();

        Class<?>[] argsClass = new Class[args.length];

        for (int i = 0, j = args.length; i < j; i  ) {
            if (args[i].getClass() == Integer.class) { //一般的函数都是 int 而不是Integer
                argsClass[i] = int.class;
            }
            else if (args[i].getClass() == Float.class) { //一般的函数都是 int 而不是Integer
                argsClass[i] = float.class;
            }
            else if (args[i].getClass() == Double.class) { //一般的函数都是 int 而不是Integer
                argsClass[i] = double.class;
            }
            else {
                argsClass[i] = args[i].getClass();
            }
        }

        Method method = ownerClass.getDeclaredMethod(methodName, argsClass);
        method.setAccessible(true);
        return method.invoke(owner, args);
    }

    /**
     * 
     * @title: invokeMethodAll
     * @description: 调用所有的函数, 包括父类的所有函数
     * @param owner
     * @param methodName
     * @param args
     * @return
     * @throws Exception
     * @return: Object
     */
    public static Object invokeMethodAll(Object owner, String methodName, Object... args) throws Exception {

        Class<?> ownerClass = owner.getClass();

        Class<?>[] argsClass = new Class[args.length];

        for (int i = 0, j = args.length; i < j; i  ) {
            if (args[i].getClass() == Integer.class) { //一般的函数都是 int 而不是Integer
                argsClass[i] = int.class;
            }
            else if (args[i].getClass() == Float.class) { //一般的函数都是 int 而不是Integer
                argsClass[i] = float.class;
            }
            else if (args[i].getClass() == Double.class) { //一般的函数都是 int 而不是Integer
                argsClass[i] = double.class;
            }
            else {
                argsClass[i] = args[i].getClass();
            }
        }
        Method method = null;

        for (Class<?> clazz = ownerClass; clazz != Object.class; clazz = clazz.getSuperclass()) {
            try {
                method = clazz.getDeclaredMethod(methodName, argsClass);
                LogUtil.d(method   " find : in "   clazz.getName());
                return method;
            }
            catch (Exception e) {
                //e.printStackTrace();
                LogUtil.d(methodName   " not find in "   clazz.getName());
            }
        }
        method.setAccessible(true);
        return method.invoke(owner, args);
    }

    /**
     * 执行某类的静态方法
     * 
     * @param className
     *            类名
     * @param methodName
     *            方法名
     * @param args
     *            参数数组
     * @return 执行方法返回的结果
     * @throws Exception
     */
    public static Object invokeStaticMethod(String className, String methodName, Object... args) throws Exception {
        Class<?> ownerClass = Class.forName(className);

        Class<?>[] argsClass = new Class[args.length];

        for (int i = 0, j = args.length; i < j; i  ) {
            argsClass[i] = args[i].getClass();
        }

        Method method = ownerClass.getMethod(methodName, argsClass);
        method.setAccessible(true);
        return method.invoke(null, args);
    }

    /**
     * 新建实例
     * 
     * @param className
     *            类名
     * @param args
     *            构造函数的参数 如果无构造参数,args 填写为 null
     * @return 新建的实例
     * @throws Exception
     */
    public static Object newInstance(String className, Object[] args) throws NoSuchMethodException, SecurityException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        return newInstance(className, args, null);

    }

    /**
     * 新建实例
     * 
     * @param className
     *            类名
     * @param args
     *            构造函数的参数 如果无构造参数,args 填写为 null
     * @return 新建的实例
     * @throws Exception
     */
    public static Object newInstance(String className, Object[] args, Class<?>[] argsType) throws NoSuchMethodException, SecurityException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Class<?> newoneClass = Class.forName(className);

        if (args == null) {
            return newoneClass.newInstance();

        }
        else {
            Constructor<?> cons;
            if (argsType == null) {
                Class<?>[] argsClass = new Class[args.length];

                for (int i = 0, j = args.length; i < j; i  ) {
                    argsClass[i] = args[i].getClass();
                }

                cons = newoneClass.getConstructor(argsClass);
            }
            else {
                cons = newoneClass.getConstructor(argsType);
            }
            return cons.newInstance(args);
        }

    }

    /**
     * 是不是某个类的实例
     * 
     * @param obj
     *            实例
     * @param cls
     *            类
     * @return 如果 obj 是此类的实例,则返回 true
     */
    public static boolean isInstance(Object obj, Class<?> cls) {
        return cls.isInstance(obj);
    }

    /**
     * 得到数组中的某个元素
     * 
     * @param array
     *            数组
     * @param index
     *            索引
     * @return 返回指定数组对象中索引组件的值
     */
    public static Object getItemInArray(Object array, int index) {
        return Array.get(array, index);
    }

    /**
     * 
     * @title: GetClassListByPackage
     * @description: 获取包下的所有Class
     * @param pPackage
     * @return
     * @return: Class<?>
     */
    public static Class<?> getClassListByPackage(String pPackage) {
        Package _Package = Package.getPackage(pPackage);
        Class<?> _List = _Package.getClass();

        return _List;
    }
}

1.下边的程序运行结果是什么?

 

注意:

2.你如何解释会得到这样的输出?

自从换了个视频教学,感觉比原来那个好多了,就是学校网速太渣,好多视频看一会卡半天,只能先看看已经下载的了.

1.调用getMethods方法输出的是自身的public方法和父类Object的public方法。调用getDeclaredMethods方法输出的是自身的public、protected、private方法。

3.计算机是不会出错的,之所以得到这样的运行结果也是有原因的,那么从这些运行结果中,你能总结出Java的哪些语法特性?

不过也好,虽然不能从开始开始重新开,但是已经看过一次,在看一次也是好的,就当巩固学习了.

2.如果想获取父类的私有函数

 

 

public static Method getDeclaredMethod(Object object, String methodName, Class<?> ... parameterTypes){  
    Method method = null ;  

    for(Class<?> clazz = object.getClass() ; clazz != Object.class ; clazz = clazz.getSuperclass()) {  
        try {  
            method = clazz.getDeclaredMethod(methodName, parameterTypes) ;  
            return method ;  
        } catch (Exception e) {  
        }  
    }  

    return null;  
}

源代码:

继承的关键字:extends

来自:

package duotai;

格式如下: class 子类名 extends父类名{

 

...

class Parent

}

{

例如 学生是继承人类这一父类的.

    public int myValue=100;

class student extends person{

    public void printmyValue()

...

    {

}

   

如果一个类的声明没有使用关键字extends,则这个类默认是继承Object类的.Object是所有类的父类.Object是java.lang包中的类.

    System.out.println("Parent.myValue,myValue=" myValue);

当一个子类继承了一个父类时,子类可以调用父类中的所有方法和成员变量.子类也可以单独自己声明方法或者变量.

    }

下面的代码创建了4个class.分别是Dog,Cat,Animal和包含主函数的Main类.其中Dog和Cat是继承父类Animal的.

}

 

class Child extends Parent {

Cat继承Animal类:

    public int myValue=200;

package com.cnblogs;

    public void printmyValue()

public class Cat extends Animal{  

    {

//不带参数的默认构造器

       System.out.println("Child.printmyvalue,myValue=" myValue);

 public Cat(){   

    }

//super();必须出现在构造方法的首行.   //this();也如此.  

 

     super();

}

 // super("XX",10);  该代码表示调用父类带参的构造器  

 

 System.out.println("Cat构造器");  }

public class ParentChildTest{

 /* public String name;

    public static void main(String[]args)

   public int age;  

    {

   public void walk(){

       Parent p=new Parent();     //定义对象并使对象指向引用p

    System.out.println("Cat....walk");  

       p.printmyValue();         //引用调用方法

}

       Child c=new Child();

 public void sleep(){

       c.printmyValue();

    System.out.println("Cat....sleep");

       p=c;        //引用子类引用,调用方法时也是调用子类方法

 }  */

       p.printmyValue();   //输出200

 //注解提示

      

@Override  

       p.myValue ;

public void how(){

       p.printmyValue();

    System.out.println(name " " "Cat....miaomiao");  

      

//super 强制调用父类的show()方法法.

       ((Child)p).myValue ;

//如果没有super,show();是this.show();的默认写法.   

       ((Child)p).printmyValue();

//步骤是:先调用子类的show()方法.子类如果没有show方法才调用父类的show()方法  

      

    super.show();

    }

 }

}

 public void show(){

实验结果截图:

    System.out.println(name " " "Cat----->show");  

 

}

 

}

 

声明Dog类:

解释输出结果:

package com.cnblogs;

  1. 第一个输出是Parent类的引用调用其方法从而输出myValue的值100.
  2. 第一个输出是Child类的引用调用其方法从而输出myValue的值200.
  3. 第三个输出200,是由于Parent类的引用对象p引用Child类的引用对象c,因此p调用printmyValue()方法来自于Child类,故输出结果是200
  4. 第三个输出200,是由于
  5. 第五个输出201,是由于基类对象通过(Child)p从而赋给子类对象,故(Child)p调用printmyValue时调用的是Child的方法,从而输出201.

public class Dog extends Animal {  

 

/*public String name;

 

   public int age;  

Java语法特性:

   public void walk(){

当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。

      System.out.println("Dog....walk");  

 

}  

 

   public void sleep(){  

 

     System.out.println("Dog....sleep");

 

 }  */

 

   public void how(){  

请使用javap查看编译器为TestPolymorphism.java生成的字节码指令,然后通过互联网搜索资料,尝试从底层开始理解Java编译器是如何为多态代码生成字节码指令,在程序运行过程中,多态特性又是如何实现的。

     System.out.println(name " " "Dog....wangwang");  }

class Parent

}

{

 

public int value=100;

创建一个Animal的父类:

public void Introduce()
{

package com.cnblogs;

System.out.println("I'm father");

//Animal不写继承就是默认继承Object类. //抽象类不能new.传入的是子类的实例对象.

}

public abstract class Animal extends Object{  

}

    public String name;

class Son extends Parent
{

    public int age;  

public int value=101;

//默认的不带参的构造器

public void Introduce()
{

 public Animal(){  

System.out.println("I'm son");

    this("baobao",2);

}

//this();调用的是下面带参的Animal的方法   

}

    System.out.println("Animal--->()");

class Daughter extends Parent
{

 }  

public int value=102;
public void Introduce()
{

//带参的构造器.给属性赋初始值

System.out.println("I'm daughter");

public Animal(String name,int age){   

}

    this.name = name;  

}

    this.age = age;  

public class TestPolymorphism
{

    System.out.println("Animal--->(name,age)");

public static void main(String args[])
{

 }  

Parent p=new Parent();

public void walk(){

p.Introduce();

    System.out.println(name "---->walk");   

System.out.println(p.value);

    sleep();

p=new Son();

    how();

p.Introduce();

//this.show 调用的是子类的show()方法,如果子类没有show()方法.在调用父类的show()方法.  

System.out.println(p.value);

    this.show();

p=new Daughter();

 }  

p.Introduce();

 public void sleep(){

System.out.println(p.value);

    System.out.println(name "---->sleep");

}

 }  

}

//抽象方法.

结果:

 public abstract void how();  

I'm father
100
I'm son
100
I'm daughter
100

 public void eat(){

 

    System.out.println(name "---->Eat");

 

 }  

 

 public void play(){ 

用多态的方法模拟ATM操作

    System.out.println(name "---->Play");

 图片 1

 }

图片 2

 public void show(){

图片 3

    System.out.println(name " " "Animal---->show");

 

}

结果截图:

}

图片 4

 Main类(包含主函数):

 

 

package com.cnblogs;

 

public class Main {

 

 public static void main2(String[] args) {  

 //生成一个cat对象

    Cat cat = new Cat();  

    cat.name ="xiaohua";  

    cat.age = 3;  

    cat.walk();   

    cat.how();   

//生成一个dog对象  

    Dog dog = new Dog();  

    dog.name = "xiaomei";   

    dog.age= 3;  

    dog.walk();  

    dog.eat();  

    dog.how();  

 //调用的是调出来的对象  

    Animal animal = new Cat();

    animal.name = "HH";

  //调用的是子类Cat()的how()方法.   

    animal.how();   

    Animal animal2 = new Dog();

    animal2.name = "XX";  

 //调用的是子类Dog()的how方法  

    animal2.how();      

    animal.walk();     

 //GetMsg方法要求传入的是子类cat,所以传入的必须是cat,而不能是animal.  

    GetMsg(cat);  

    GetMsg(dog);  

    GetMsg(animal2);

 }  

/* public static void GetMsg(Cat cat){

  cat.how();  

}*/  

//将子类的对象传入给父类的引用   //比上面的传入单独的cat灵活,一般使用下面这种方法  

public static void GetMsg(Animal animal){

    animal.how();   

}  

/** *1. new一个对象以后先调用子类Cat的第一个方法,运行super();调用父类Animal的第一个方法   

  *2. 父类中的构造方法执行this();方法,this方法又调用Animal带参数的方法并输出;在返回不带参的构造器执行this();下面的输出语句   

  *3. 在返回子类Cat中执行super();下面的语句,输出"Cat构造器"   

  *4. 接着animal.how()调用new出来的对象 cat的how()方法   

  *5. 执行子类Cat()方法中的how()方法,并输出.   

  *6. 接着在运行how()方法中的super().show;然后调用父类Animal的show()方法.并输出相应的结果.    * */  

public static void main(String [] args){  

    Animal animal = new Cat();   

    animal.how();   }

}

 

super();调用父类的构造器,方法和属性.

this();调用该方法的当前对象.

 

今天博客园居然不能插入代码块,不知道出什么问题只能自己手写,写了半天.看的头都晕了.

编辑:ca88 本文来源:反射工具类,Java学习笔记

关键词: 亚洲城ca88