zoukankan      html  css  js  c++  java
  • Java反射机制(创建Class对象的三种方式)

    Java反射机制(创建Class对象的三种方式)

     

    1:SUN提供的反射机制的类:

    java.lang.Class<T>

    java.lang.reflect.Constructor<T>

    java.lang.reflect.Field

    java.lang.reflect.Method

    java.lang.reflect.Modifier

    2:什么是反射

    JAVA反射机制是在运行状态中,对于任意一个类。都能都知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称之为java语言的反射机制;

    3:反射的作用

    反编译 .class --à .java

    通过反射机制可以访问java对象中的属性,方法,构造方法

    4:创建Class对象的三种方式

    JavaBean:

    复制代码
    public class Person implements China{
          private String name;
          private int age ;
          private char sex ;
    
          public Person() {
               super ();
         }
    
          public Person(String name, int age, char sex) {
               super ();
               this .name = name;
               this .age = age;
               this .sex = sex;
         }
    
          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;
         }
    
          public char getSex() {
               return sex ;
         }
    
          public void setSex(char sex) {
               this .sex = sex;
         }
          public void eat()
         {
              System. out .println("吃了" );
         }
    
          @Override
          public String toString() {
               return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]" ;
         }
    
          @Override
          public void sayChina() {
               // TODO Auto-generated method stub
              System. out .println("作者:" + AUTHOR + "国籍:"+ NATIONAL );
         }
    
          @Override
          public String sayHello(String name, int age, char sex) {
               // TODO Auto-generated method stub
               return "姓名:" + name + "年龄:"+ age + "性别:" + sex;
         }
    
    }
    复制代码
    复制代码
     1 public class ClassDemo02 {
     2 
     3      public static void main(String[] args) {
     4           Person p1 = new Person("小明" ,20,'男' );
     5           Person p2 = new Person("小红" ,23,'女' );
     6 
     7            //创建Class对象的方式一:(对象.getClass()),获取person类中的字节码文件
     8            Class class1 = p1.getClass();
     9           System. out.println(p1.getClass().getName());
    10            Class class2 = p2.getClass();
    11           System. out.println(class1 == class2 );
    12 
    13           System. out.println("==============================" );
    14            //创建Class对象的方式二:(类.class:需要输入一个明确的类,任意一个类型都有一个静态的class属性)
    15            Class class3 = Person.class;
    16           System. out.println(class1 == class2);
    17 
    18           System. out.println("==============================" );
    19            //创建Class对象的方式三:(forName():传入时只需要以字符串的方式传入即可)
    20            //通过Class类的一个forName(String className)静态方法返回一个Class对象,className必须是全路径名称;
    21            //Class.forName()有异常:ClassNotFoundException
    22 
    23            Class class4 = null;
    24            try {
    25               class4 = Class.forName("cn.itcast.Person");
    26           } catch (ClassNotFoundException e) {
    27                // TODO Auto-generated catch block
    28               e.printStackTrace();
    29           }
    30           System. out.println(class4 == class3);
    31      }
    32 }
    复制代码

    注意:在开发中一般使用第三种方法,因为第三种接收的是一个字符串路径,将来可以通过配置文件获取,通用性好;

    4:newInstance()方法 ---> 获取class类型之后,可以创建该类型的对象

    public T newInstance()throws InstantiationException,IllegalAccessException

    复制代码
     1 public class reflect03 {
     2 
     3     public static void main(String[] args) throws Exception {
     4 
     5         Class c1 = Class.forName("com.itheima04.Test_20171106.Test_20171207.Person");
     6 
     7         //创建此Class对象所表示类的一个新实例,
     8         //newInstance方法调用的是Person的空参数构造方法
     9         Object o = c1.newInstance();
    10         System.out.println(o.toString());
    11     }
  • 相关阅读:
    SQL Server, Timeout expired.all pooled connections were in use and max pool size was reached
    javascript 事件调用顺序
    Best Practices for Speeding Up Your Web Site
    C语言程序设计 使用VC6绿色版
    破解SQL Prompt 3.9的几步操作
    Master page Path (MasterPage 路径)
    几个小型数据库的比较
    CSS+DIV 完美实现垂直居中的方法
    由Response.Redirect引发的"Thread was being aborted. "异常的处理方法
    Adsutil.vbs 在脚本攻击中的妙用
  • 原文地址:https://www.cnblogs.com/lenglangjin/p/10503061.html
Copyright © 2011-2022 走看看