java的反射

在java语言中,反射机制是指对于处在运行状态的类,都能够获取到这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意一个方法以及访问它的属性;这种通过动态获取类或对象的属性以及方法从而完成调用功能被称为java语言的反射机。

它主要实现以下功能: 

  1. 获取类的访问修饰符、方法、属性以及父类信息。
  2. 在运行时根据类的名字创建对象。可以在运行时调用任意一个对象的方法。
  3. 在运行时判断一个对象属于哪个类。
  4. 生成动态代理。 

在反射机制中Class是一个非常重要的类,在java语言中获取Class对象主要有如下方法。

通过className.class来获取 

class A{

    static{System.out.println("static block");}
    {System.out.println("dynamic block");}

}

class Test{

    public static void main(String[] args){

        Class c=A.class;
        System.out.println("className:"+c.getName());
    }
}
// 运行结果为:className:A

 通过Class.forName()来获取

public static void main(String[] args){

    Class c=null;
    try{
        c=Class.forName("A");
    }catch(Exception e){
        e.printStackTrae();
    }
    System.out.println("className:"+c.getName());
}

// 程序运行结果为:
// static block 
// className:A

通过Object.getClass()来获取

public static void main(String[] args){
    Classc=new A().getClass();
    System.out.println("className:"+c.getName());
}
// 程序运行结果:
// static block
// dynamic block
// className:A

区别 

从上面的例子可知,虽然这三种方式都可以获得类的Class对象,但是它们还是有区别的,主要区别如下:

  • 方法1 不执行静态块和动态构造块。
  • 方法2 只执行静态块,而不执行动态构造块。
  • 方法3 因为需要创建对象,所以会执行静态块和动态构造块。

方法 

1. 获取类的构造方法。

  1. public Constructor[] getConstructors(): 返回类的所有的public构造方法。
  2. public Constructor getConstructor(Class ... parameterTypes): 返回指定的public构造方法。
  3. public Constructor[] getDeclaredConstructors()" 返回类的所有的构造方法。
  4. public Constructor getDeclaredConstructor(Class... parameterTypes): 返回指定的构造方法 

2. 获取类的成员变量的方法

  1. public Field[] getFields(): 获取类的所有public成员变量.
  2. public Field getField(String name): 获取指定的public成员变量;
  3. public Field[] getDeclaredFields(): 获取类的所有成员变量。
  4. public Field getDeclaredField(String name): 获取任意访问权限的指定名字的成员变量。 

3. 获取类的方法

  1. public Method[] getMethods():
  2. public Method getMethod(String name,Class... parameterTypes) public Method[];
  3. getDeclaredMethods(): 获取所有的方法
  4. public Method getDeclaredMethod(String name,Class...parameterTypes).

使用实例 

public class Test{
    protected Test(){System.out.println("Protected constructor");}
    public Test(String name){System.out.println("Public constructor");}
    public void f() {System.out.println("f()");}

    public void g(int i){System.out.println("g():"+i);}
    class Inner{}

    public static void main(String[] args)throws Exception{

        Class clazz=Class.forName("Test");

        Constructor[] constructors=clazz.getDeclaredConstructors();
        System.out.println("Test类的构造方法");
        for(Constructor c:constructors){
            System.out.println(c);
        }
        Method[] methods=clazz.getMethods();
        System.out.println("Test的全部public方法:")
        for(Method md : methods){
            System.out.println(md);
        }
        Class inners=clazz.getDeclaredClasses();
        System.out.println("Test类的内部类为:");
        for(CLsss c:inners)
        {

            System.out.println(c);
        }
    }

}



// 程序运行结果为:
// Test类的构造方法
// protected Test()
// public Test(java.lang.String)
// Test的全部public方法:
// public static void Test.main(java.lang.String[] args)throws java.lang.Exception
// public void Test.f()
// public void Test.g(int)
// public final void java.lang.Object.wait() throws java.lang.InterruptedException
// public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
// public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
// public boolean java.lang.Object.equals(java.lang.Object)
// publicjava.lang.Sring java.lang.Object.tostring()
// public native int java.lang.Object.hashCode()
// public final native java.lang.Class java.lang.Object.getClass()
// public final native void  java.lang.Object.notify()
// public final native void  java.lang.Object.notifyAll()
// Test类的内部类为
// class Test$Inner

 

你可能感兴趣的:(java面试题,java,python,开发语言)