zoukankan      html  css  js  c++  java
  • 【java】反射简单示例

    1 package 反射;
    2 
    3 public class Test反射 {
    4     public static void main(String[] args) {
    5         System.out.println(Runtime.getRuntime().getClass());//class java.lang.Runtime
    6         Test反射 t=new Test反射();
    7         System.out.println(t.getClass());//class 反射.Test反射
    8     }
    9 }
    getClass
     1 package 反射;
     2 
     3 public class Test反射 {
     4     public static void main(String[] args) {
     5         Test反射 t=new Test反射();
     6         //Class类是反射操作的源头,所有的反射都要从此类开始进行。
     7         Class<?> cls=t.getClass();//第1种Class类实例化方法,用的很少
     8         System.out.println(cls);//class 反射.Test反射
     9         Class<?> cls2=Test反射.class;//第2种Class类实例化方法,用的多,使用领域:Hibernate、Mybatis、Spring
    10         System.out.println(cls2);//class 反射.Test反射
    11         Class<?> cls3=null;
    12         try {
    13             cls3=Class.forName("反射.Test反射");//第3种Class类实例化方法,用的多。此处要写全名,即加上包名,否则报错。
    14         } catch (ClassNotFoundException e) {
    15             e.printStackTrace();
    16         }
    17         System.out.println(cls3);//class 反射.Test反射
    18     }
    19 }
    Class类3种实例化方式
     1 package 反射;
     2 class A{
     3     public A(){
     4         System.out.println("调用无参构造实例化对象。");
     5     }
     6     @Override
     7     public String toString() {
     8         return "调用toString()方法。";
     9     }
    10 }
    11 public class Test反射 {
    12     public static void main(String[] args) {
    13         Class<?> cls=null;
    14         try {
    15             cls=Class.forName("反射.A");
    16         } catch (ClassNotFoundException e) {
    17             e.printStackTrace();
    18         }
    19         Object o=null;
    20         try {
    21             o=cls.newInstance();
    22         } catch (InstantiationException e) {
    23             e.printStackTrace();
    24         } catch (IllegalAccessException e) {
    25             e.printStackTrace();
    26         }
    27         System.out.println(o);
    28         /**
    29          * 运行结果:
    30          *    调用无参构造实例化对象。
    31          *    调用toString()方法。
    32          */
    33     }
    34 }
    利用反射进行实例化对象
     1 package 反射;
     2 
     3 import java.lang.reflect.Constructor;
     4 import java.lang.reflect.InvocationTargetException;
     5 
     6 class A{
     7     private String name;
     8     private int age;
     9     public A(String name,int age){
    10         System.out.println("调用有参构造实例化对象。");
    11         this.name=name;
    12         this.age=age;
    13     }
    14     @Override
    15     public String toString() {
    16         return "调用toString()方法:name="+name+",age="+age;
    17     }
    18 }
    19 public class Test反射 {
    20     public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
    21         Class<?> cls=null;
    22         try {
    23             cls=Class.forName("反射.A");
    24         } catch (ClassNotFoundException e) {
    25             e.printStackTrace();
    26         }
    27         Object o=null;
    28         try {
    29             Constructor<?> con=cls.getConstructor(String.class,int.class);
    30             o=con.newInstance("张三",18);//从此处可以看出以后定义类的构造方法时最好保留一个无参构造。
    31         } catch (InstantiationException e) {
    32             e.printStackTrace();
    33         } catch (IllegalAccessException e) {
    34             e.printStackTrace();
    35         }
    36         System.out.println(o);
    37         /**
    38          * 运行结果:
    39          *    调用有参构造实例化对象。
    40          *    调用toString()方法:name=张三,age=18
    41          */
    42     }
    43 }
    利用反射实例化对象,调用有参构造。
     1 package 反射;
     2 
     3 import java.lang.reflect.InvocationTargetException;
     4 import java.lang.reflect.Method;
     5 
     6 class Person{
     7     private String name;
     8     public void setName(String name) {
     9         this.name = name;
    10     }
    11     public String getName() {
    12         return name;
    13     }
    14 }
    15 public class Test反射 {
    16     public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    17         Class<?> cls=Class.forName("反射.Person");
    18         Object obj=cls.newInstance();
    19         Method methodSetName=cls.getMethod("setName", String.class);
    20         Method methodGetName=cls.getMethod("getName");
    21         methodSetName.invoke(obj, "张三");
    22         System.out.println(methodGetName.invoke(obj));//张三
    23     }
    24 }
    利用反射调用普通方法
     1 package 反射;
     2 
     3 import java.lang.reflect.Field;
     4 
     5 class Person{
     6     @SuppressWarnings("unused")
     7     private String name;
     8 }
     9 public class Test反射 {
    10     public static void main(String[] args) throws Exception {
    11         Class<?> cls=Class.forName("反射.Person");
    12         Object obj=cls.newInstance();
    13         Field fieldName=cls.getDeclaredField("name");
    14         fieldName.setAccessible(true);//私有属性的存取不建议用引方式,最好还是用setter和getter方法
    15         fieldName.set(obj, "张三");
    16         System.out.println(fieldName.get(obj));//张三
    17     }
    18 }
    利用反射存取属性
  • 相关阅读:
    git如何进行远程分支切换
    js中实现多态
    css选择器中:first-child与:first-of-type的区别
    js实现图片延时加载的原理
    认识AMD、CMD、UMD、CommonJS
    CORS详解
    JS实现继承的五种方式
    jQuery.fn.extend() 函数详解
    Java基础面试题
    Java面试题集
  • 原文地址:https://www.cnblogs.com/xiongjiawei/p/6681894.html
Copyright © 2011-2022 走看看