发表于: 2017-10-05 19:10:52

1 767


今天完成的事情:

一、Java reflect反射基础

(1)Java reflect的含义:

     反射机制是程序在运行过程中,对于任意一个类可以可以获取它的属性和方法,对于任意一个对象可以调用它的属性和方法,动态的获取信息以及动态的调用对象。

(2)Java反射的作用:

     ·动态得加载类,调用对象属性和方法。

     ·获取任意个类的属性和方法

(3)根据Java反射机制来写一个工具类获取相关信息,这次实在idea中实践例子,也是学习idea这个现在比较流行的IDE工具软件。

1.首先是结构目录,这里直接建Java普通项目,不适用maven。

2. 建ClassInfo.java工具类

package com.lihq.util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 工具类,用于获取某个类中信息,包括成员变量,成员方法。用的Java的反射相关知识
*/
public class ClassInfo {
public static void printClassInfo(Object obj){

/**
        * 获取类中的成员变量的种类,返回值类型,参数类型
        */
       System.out.println("成员变量:");
       //1.定义Class类实例指向传入的类obj
        Class c = obj.getClass();
       //2.Class类中的getField方法获取该类的成员变量的类类型,返回Field数组
       Field[] fs=c.getFields();
       //3.获取fs的类类型,getType方法,返回Class,目前只能获得Public类型的
       for(Field field:fs){
Class fieldType=field.getType();
           String fieldTypeName=fieldType.getSimpleName();
           System.out.println(fieldTypeName+" "+field.getName());
           System.out.println("-------------");
       }
System.out.println();
       /**
        * 获取对象的成员方法
        */
       //1.获取对象的方法,用methods[]方法
       Method[] ms= c.getDeclaredMethods();
       System.out.println("成员方方法:");
       //2.获取方法的返回值类类型
       for (Method method:ms){
Class returnType = method.getReturnType();
           StringBuilder sb=new StringBuilder();
           sb.append(returnType.getSimpleName()+"(");
           //3.获取参数类类型
           Class[] parameterType= method.getParameterTypes();
           for (int i = 0; i < parameterType.length; i++) {
sb.append(parameterType[i].getSimpleName()+",");

           }
sb.deleteCharAt(sb.length()-1);
           sb.append(")");
           System.out.println(sb);
           System.out.println("------------");

       }
}
}

3.新建测试类

package com.lihq.util;

import org.junit.Test;

import static org.junit.Assert.*;

public class ClassInfoTest {
public class A{
public A(){

}
public int i;
       public String j;
       public boolean m;
       public double g;
       public int sum(int a,int b){
return a+b;
       }
public void addString (String a,int b){
System.out.println("shi");
       }
}

@Test
   public void printClassInfo() throws Exception {
ClassInfo.printClassInfo(new A());
   }

}

4.测试的结果

成员变量:

int i

-------------

String j

-------------

boolean m

-------------

double g

-------------

成员方方法:

int(int,int)

------------

void(String,int)

------------

明天的计划:

1.学习springMVC

遇到的问题:

暂无

收获:

(1) Java的反射主要是依靠Class这个类来实现的,Class类的对象是其它普通类。图示:

(2)  从面向对象的角度来看,Java中定义的各种类例如User,这些类被称为POJO或者javabean。它们的实例化也就是u1,u2,它们都是User类的一个具体的实例,都具有User这个类的属性和方法。

 

(3)  如User这种类是非常多了,那么它们的共同点在哪里呢?其实不难发现它们都是具有属性和方法的封装体。从一切皆对象的角度来看,它们也是一种对象,也是一种实例,那么它们必然有一个类,这个类在Java里就是Class类,Class类可以说是类的类。从上面的图示也可看出Class类的实例c1,c2指向的是User这个类。

(4)Class类是不能通过new关键字来实例化的,它的构造函数是只能Java虚拟机加载的。那么实例化的方法主要有三种方式:

     --1.已知一个类名,例User

             Class c1=User.class;//这种直接 [类名].class方式获取实例化

     --2.已知一个类的实例化,调用类方法getClass

             Class c2=u2.getClass();

     --3.通过Class类的方法forName()来加载普通类

             Class c3=Class.forName("类的全称");//类的全称包括包名加类名

     例如在JDBC连接数据库操作中,首先要做的就是加载驱动,其实就是第三种方式来获取Driver这个类,以MySQL数据库为例:

     Class.forName("com.mysql.jdbc.Driver");//这是动态加载类

(5)通过Class类的获取普通类的实例化

     c1.newInstance();



返回列表 返回列表
评论

    分享到