(一)获取类的三种方式,根据类获取成员变量,成员方法,直接实现的接口,自己的构造方法,直接的父类
2018-01-22 22:26
633 查看
Java 反射机制 可以从类路径,类,对象获得类,然后获取这个类的所有信息,并加以运用。简单的来说,反射机制指的是程序在运行时能够获取自身的信息。
为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念,
静态编译:在编译时确定类型,绑定对象,即通过。
动态编译:运行时确定类型,绑定对象。
动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性。
它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。
第一部分:Java 反射机制获取类、成员方法、成员变量、父类、实现的接口和构造方法
总述:
在成员变量、成员方法上是区分本类和本类以上继承的父类或实现的接口,在构造方法,获取接口上,只能获取本类自己的构造方法,或者直接实现的接口。此外,有无Declared的方法获取的结果被限制为 public 修饰
获取类的三种方式:
Class.forName("demo3.Demo3Class1")=
class demo3.Demo3Class1
Demo3Class1.class=
class demo3.Demo3Class1
demo31.getClass()=
class demo3.Demo3Class1
obj.getMethods()=获取该类以及所有父类及以上的类的 public 修饰的方法,注意完全的打印方式都有public前缀
obj.getDeclaredMethods()=获取该类(仅该类)的方法,不限制是否 public 修饰
obj.getInterfaces()=获取本类直接实现的接口
obj.getSuperclass()=获取本类的直接父类,默认是Object
class java.lang.Object
获取本类的直接构造函数(无参构造函数默认存在,一旦写了有参构造函,无参构造函数就没了,需要重新写:
obj.getConstructors()=获取本类的直接构造函数,仅限 public 修饰的构造函数
obj.getDeclaredConstructors()=获取本类的直接构造函数,本类所有的构造函数,不限制是否public 修饰
obj.getFields()=获取本类、本类以上继承的类、实现的接口的被public 修饰的 变量
obj.getDeclaredFields()=获取仅本类的所有变量,不限制是否被 public 修饰
代码:
接口 Demo3Interface.java、实现接口
Demo3Interface.java 的类 Demo3Class1.java,继承Demo3Class1.java的类Demo3Class2.java,测试类 Demo3Test.java
接口类
实现接口的类1
继承类1的类2
测试类
结果输出就是
获取类的三种方式:
Class.forName("demo3.Demo3Class1")=
class demo3.Demo3Class1
Demo3Class1.class=
class demo3.Demo3Class1
demo31.getClass()=
class demo3.Demo3Class1
获取该类以及所有父类及以上的类的 public 修饰的方法:
obj.getMethods()=获取该类以及所有父类及以上的类的 public 修饰的方法,注意完全的打印方式都有public前缀
public void demo3.Demo3Class1.method1(java.lang.String)
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)
public java.lang.String 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()
获取该类(仅该类)的方法:
obj.getDeclaredMethods()=获取该类(仅该类)的方法,不限制是否 public 修饰
public void demo3.Demo3Class1.method1(java.lang.String)
private void demo3.Demo3Class1.method2(java.lang.String)
获取本类直接实现的接口:
Demo3Class1 implements Demo3Interface
Demo3Class2 extends Demo3Class1
obj.getInterfaces()=获取本类直接实现的接口
interface demo3.Demo3Interface
obj.getInterfaces()=获取本类直接实现的接口
获取本类的直接父类,默认是Object:
obj.getSuperclass()=获取本类的直接父类,默认是Object
class java.lang.Object
obj2.getSuperclass()=获取本类的直接父类,默认是Object
class demo3.Demo3Class1
获取本类的直接构造函数(无参构造函数默认存在,一旦写了有参构造函,无参构造函数就没了,需要重新写:
obj.getConstructors()=获取本类的直接构造函数,仅限 public 修饰的构造函数
public demo3.Demo3Class1(java.lang.String,java.lang.String)
public demo3.Demo3Class1()
obj.getDeclaredConstructors()=获取本类的直接构造函数,本类所有的构造函数
public demo3.Demo3Class1(java.lang.String,java.lang.String)
private demo3.Demo3Class1(java.lang.String)
public demo3.Demo3Class1()
获取本类、本类以上继承的类、实现的接口的被public 修饰的 变量:
obj.getFields()=获取本类、本类以上继承的类、实现的接口的被public 修饰的 变量
public java.lang.String demo3.Demo3Class1.str3
public static final int demo3.Demo3Interface.number1
public static final java.lang.Integer demo3.Demo3Interface.number2
obj2.getFields()=获取本类、本类以上继承的类、实现的接口的被public 修饰的 变量
public java.lang.String demo3.Demo3Class2.str3
public java.lang.String demo3.Demo3Class1.str3
public static final int demo3.Demo3Interface.number1
public static final java.lang.Integer demo3.Demo3Interface.number2
obj.getDeclaredFields()=获取仅本类的所有变量,不限制是否被 public 修饰
private static final java.lang.String demo3.Demo3Class2.str1
java.lang.String demo3.Demo3Class2.str2
public java.lang.String demo3.Demo3Class2.str3
综述:
在成员变量、成员方法上是区分本类和本类以上继承的父类或实现的接口,在构造方法,获取接口上,只能获取本类自己的构造方法,或者直接实现的接口。此外,有无Declared的方法获取的结果被限制为 public 修饰
为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念,
静态编译:在编译时确定类型,绑定对象,即通过。
动态编译:运行时确定类型,绑定对象。
动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性。
它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。
第一部分:Java 反射机制获取类、成员方法、成员变量、父类、实现的接口和构造方法
总述:
在成员变量、成员方法上是区分本类和本类以上继承的父类或实现的接口,在构造方法,获取接口上,只能获取本类自己的构造方法,或者直接实现的接口。此外,有无Declared的方法获取的结果被限制为 public 修饰
获取类的三种方式:
Class.forName("demo3.Demo3Class1")=
class demo3.Demo3Class1
Demo3Class1.class=
class demo3.Demo3Class1
demo31.getClass()=
class demo3.Demo3Class1
obj.getMethods()=获取该类以及所有父类及以上的类的 public 修饰的方法,注意完全的打印方式都有public前缀
obj.getDeclaredMethods()=获取该类(仅该类)的方法,不限制是否 public 修饰
obj.getInterfaces()=获取本类直接实现的接口
obj.getSuperclass()=获取本类的直接父类,默认是Object
class java.lang.Object
获取本类的直接构造函数(无参构造函数默认存在,一旦写了有参构造函,无参构造函数就没了,需要重新写:
obj.getConstructors()=获取本类的直接构造函数,仅限 public 修饰的构造函数
obj.getDeclaredConstructors()=获取本类的直接构造函数,本类所有的构造函数,不限制是否public 修饰
obj.getFields()=获取本类、本类以上继承的类、实现的接口的被public 修饰的 变量
obj.getDeclaredFields()=获取仅本类的所有变量,不限制是否被 public 修饰
代码:
接口 Demo3Interface.java、实现接口
Demo3Interface.java 的类 Demo3Class1.java,继承Demo3Class1.java的类Demo3Class2.java,测试类 Demo3Test.java
接口类
package demo3; public interface Demo3Interface { int number1=1; Integer number2=2; void method1(String a); }
实现接口的类1
package demo3; public class Demo3Class1 implements Demo3Interface { private static final String str1="str1"; String str2="str2"; public String str3="str3"; public Demo3Class1() { } public Demo3Class1(String a,String b) { } public void method1(String a) { System.out.println(); } private void method2(String a){ System.out.println(); } }
继承类1的类2
package demo3; public class Demo3Class2 extends Demo3Class1 { private static final String str1="str1"; String str2="str2"; public String str3="str3"; public void method3(String name){ System.out.println(); } }
测试类
package demo3; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.junit.Test; /** * 接口 和 实现类的反射关系的探究 * @author wj * */ public class Demo3Test { /** * 在成员变量、成员方法上是区分本类和本类以上继承的父类或实现的接口,在构造方法,获取接口上,只能获取本类自己的构造方法,或者直接实现的接口 */ @Test public void test8(){ System.out.println("综述:\n在成员变量、成员方法上是区分本类和本类以上继承的父类或实现的接口,在构造方法,获取接口上,只能获取本类自己的构造方法,或者直接实现的接口。此外,有无Declared的方法获取的结果被限制为 public 修饰"); } /** * 获取仅本类的所有变量,不限制是否被 public 修饰 */ @Test public void test7(){ Demo3Class2 demo=new Demo3Class2(); Class<?> obj=demo.getClass(); Field[] fields=obj.getDeclaredFields(); System.out.println("obj.getDeclaredFields()=获取仅本类的所有变量,不限制是否被 public 修饰"); for(Field f:fields){ System.out.println(f); } System.out.println(); } /** * 获取本类、本类以上继承的类、实现的接口的被public 修饰的 成员变量 */ @Test public void test6(){ System.out.println("获取本类、本类以上继承的类、实现的接口的被public 修饰的 变量:"); Demo3Class1 demo=new Demo3Class1(); Class<?> obj=demo.getClass(); Field[] fields=obj.getFields(); System.out.println("obj.getFields()=获取本类、本类以上继承的类、实现的接口的被public 修饰的 变量"); for(Field f:fields){ System.out.println(f); } Demo3Class2 demo2=new Demo3Class2(); Class<?> obj2=demo2.getClass(); Field[] fields2=obj2.getFields(); System.out.println("obj2.getFields()=获取本类、本类以上继承的类、实现的接口的被public 修饰的 变量"); for(Field f:fields2){ System.out.println(f); } System.out.println(); } /** * 获取本类的直接构造函数 */ @Test public void test5(){ System.out.println("获取本类的直接构造函数(无参构造函数默认存在,一旦写了有参构造函,无参构造函数就没了,需要重新写:"); Demo3Class1 demo=new Demo3Class1(); Class<?> obj=demo.getClass(); Constructor<?>[] constructors=obj.getConstructors(); System.out.println("obj.getConstructors()=获取本类的直接构造函数,仅限 public 修饰的构造函数"); for(Constructor<?> c:constructors){ System.out.println(c); } System.out.println(); Constructor<?>[] constructors2=obj.getDeclaredConstructors(); System.out.println("obj.getDeclaredConstructors()=获取本类的直接构造函数,本类所有的构造函数"); for(Constructor<?> c:constructors2){ System.out.println(c); } System.out.println(); } /** * 获取本类的直接父类,默认是Object */ @Test public void test4(){ System.out.println("获取本类的直接父类,默认是Object:"); Demo3Class1 demo=new Demo3Class1(); Class<?> obj=demo.getClass(); Class<?> classs=obj.getSuperclass(); System.out.println("obj.getSuperclass()=获取本类的直接父类,默认是Object"); System.out.println(classs); Demo3Class2 demo2=new Demo3Class2(); Class<?> obj2=demo2.getClass(); Class<?> classs2=obj2.getSuperclass(); System.out.println("obj2.getSuperclass()=获取本类的直接父类,默认是Object"); System.out.println(classs2); System.out.println(); } /** * 获取本类实现的接口 * Demo3Class1 implements Demo3Interface * Demo3Class2 extends Demo3Class1 */ @Test public void test3(){ System.out.println("获取本类直接实现的接口:"); System.out.println("Demo3Class1 implements Demo3Interface" + "\nDemo3Class2 extends Demo3Class1"); Demo3Class1 demo=new Demo3Class1(); Class<?> obj=demo.getClass(); Class<?>[] classs=obj.getInterfaces(); System.out.println("obj.getInterfaces()=获取本类直接实现的接口"); for(Class<?> c:classs){ System.out.println(c); } Demo3Class2 demo2=new Demo3Class2(); Class<?> obj2=demo2.getClass(); Class<?>[] classs2=obj2.getInterfaces(); System.out.println("obj.getInterfaces()=获取本类直接实现的接口"); for(Class<?> c:classs2){ System.out.println(c); } System.out.println(); } /** * 获取该类(仅该类)的方法 */ @Test public void test2(){ System.out.println("获取该类(仅该类)的方法:"); Demo3Class1 demo=new Demo3Class1(); Class<?> obj=demo.getClass(); Method[] methods=obj.getDeclaredMethods(); System.out.println("obj.getDeclaredMethods()=获取该类(仅该类)的方法,不限制是否 public 修饰"); for(Method m:methods){ System.out.println(m); } System.out.println(); } /** * 获取该类以及所有父类及以上的类的 public 修饰的方法 */ @Test public void test1(){ System.out.println("\n获取该类以及所有父类及以上的类的 public 修饰的方法:"); Demo3Class1 demo=new Demo3Class1(); Class<?> obj=demo.getClass(); Method[] methods=obj.getMethods(); System.out.println("obj.getMethods()=获取该类以及所有父类及以上的类的 public 修饰的方法,注意完全的打印方式都有public前缀"); for(Method m:methods){ System.out.println(m); } System.out.println(); } /** * 获取类 * 有三种方式 */ @Test public void test(){ System.out.println("获取类的三种方式:"); Class<?> obj0; try { obj0 = Class.forName("demo3.Demo3Class1"); System.out.println("Class.forName(\"demo3.Demo3Class1\")=\n "+obj0);//class demo3.Demo3Class1 } catch (ClassNotFoundException e) {} Class<?> obj1=Demo3Class1.class; System.out.println("Demo3Class1.class=\n "+obj1);//class demo3.Demo3Class1 Demo3Class1 demo31=new Demo3Class1(); Class<?> obj2=demo31.getClass(); System.out.println("demo31.getClass()=\n "+obj2);//class demo3.Demo3Class1 } }
结果输出就是
获取类的三种方式:
Class.forName("demo3.Demo3Class1")=
class demo3.Demo3Class1
Demo3Class1.class=
class demo3.Demo3Class1
demo31.getClass()=
class demo3.Demo3Class1
获取该类以及所有父类及以上的类的 public 修饰的方法:
obj.getMethods()=获取该类以及所有父类及以上的类的 public 修饰的方法,注意完全的打印方式都有public前缀
public void demo3.Demo3Class1.method1(java.lang.String)
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)
public java.lang.String 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()
获取该类(仅该类)的方法:
obj.getDeclaredMethods()=获取该类(仅该类)的方法,不限制是否 public 修饰
public void demo3.Demo3Class1.method1(java.lang.String)
private void demo3.Demo3Class1.method2(java.lang.String)
获取本类直接实现的接口:
Demo3Class1 implements Demo3Interface
Demo3Class2 extends Demo3Class1
obj.getInterfaces()=获取本类直接实现的接口
interface demo3.Demo3Interface
obj.getInterfaces()=获取本类直接实现的接口
获取本类的直接父类,默认是Object:
obj.getSuperclass()=获取本类的直接父类,默认是Object
class java.lang.Object
obj2.getSuperclass()=获取本类的直接父类,默认是Object
class demo3.Demo3Class1
获取本类的直接构造函数(无参构造函数默认存在,一旦写了有参构造函,无参构造函数就没了,需要重新写:
obj.getConstructors()=获取本类的直接构造函数,仅限 public 修饰的构造函数
public demo3.Demo3Class1(java.lang.String,java.lang.String)
public demo3.Demo3Class1()
obj.getDeclaredConstructors()=获取本类的直接构造函数,本类所有的构造函数
public demo3.Demo3Class1(java.lang.String,java.lang.String)
private demo3.Demo3Class1(java.lang.String)
public demo3.Demo3Class1()
获取本类、本类以上继承的类、实现的接口的被public 修饰的 变量:
obj.getFields()=获取本类、本类以上继承的类、实现的接口的被public 修饰的 变量
public java.lang.String demo3.Demo3Class1.str3
public static final int demo3.Demo3Interface.number1
public static final java.lang.Integer demo3.Demo3Interface.number2
obj2.getFields()=获取本类、本类以上继承的类、实现的接口的被public 修饰的 变量
public java.lang.String demo3.Demo3Class2.str3
public java.lang.String demo3.Demo3Class1.str3
public static final int demo3.Demo3Interface.number1
public static final java.lang.Integer demo3.Demo3Interface.number2
obj.getDeclaredFields()=获取仅本类的所有变量,不限制是否被 public 修饰
private static final java.lang.String demo3.Demo3Class2.str1
java.lang.String demo3.Demo3Class2.str2
public java.lang.String demo3.Demo3Class2.str3
综述:
在成员变量、成员方法上是区分本类和本类以上继承的父类或实现的接口,在构造方法,获取接口上,只能获取本类自己的构造方法,或者直接实现的接口。此外,有无Declared的方法获取的结果被限制为 public 修饰
相关文章推荐
- 2018/01/08JAVA 基础 / 接口与继承/Java关键词:变量引用 super 调用父类对象方法/构造方法【或者访问父类对象属性】的方式归纳
- 策略设计模式:父类持有接口成员变量,动态设定接口成员实现类,动态改变方法
- 子类继承父类的同时又去实现一个成员变量、方法与父类相同的接口,最后调的是谁的成员变量和方法?
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- Java 子类初始化父类的构造方法 成员变量不支持多态
- python flask 服务器端实现接口,post,get 方式,参数获取方法
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- 面试题:一个方法和类名相同,那这个是构造方法吗?哪些方式可以获取或设置成员变量的值?
- 创建一个直角三角形类(regular triangle)RTriangle类,实现下列接口IShape。两条直角边长作为RTriangle类的私有成员,类中包含参数为直角边的构造方法。
- 封装,this,给成员变量赋值的方式(get(),构造方法):
- 创建一个CPoint类,代表平面直角坐标系中的点,创建构造函数和运算符重载函数, 运算符重载为类重载(非友元重载),可以实现计算两个点之间的距离。可以根据需要 加入自己的成员变量或成员函数
- 枚举的诸多使用方法enum--构造方法,普通方法method,获取枚举,实现接口
- 创建Bean的三种方式 在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法。实际上,Sprin
- activiti学习--12 个人任务及三种分配方式:直接设置代理人+流程变量设置代理人+实现类的方式设置代理人+将任务代理人设置为别人
- java反射2-获取构造方法、成员变量、成员方法
- Java多态 实例子类自动调用父类为空的构造方法 成员变量不支持Override 可写,没多态效果
- java反射机制获取成员变量调用和调用实例方法的实现
- 学习笔记_JFame事件处理的三种方法(3)类直接实现接口法
- SubClasing用法--子类重写父类方法,父类直接调用实现方式
- 创建Employee类,在类中定义三个属性:编号,姓名,年龄,然后在构造方法里初始化这三个属性,最后载实现接口中的定义的CompareTo方法,将对象按编号升序排列。根据已有的代码,补全程序。