1、认识Class类

任何一个类都是Class类的实例对象,这个实例对象有三种表示方式。

         /*java 反射机制*/
// 获取类的方法
UserDao userDao = new UserDao();
Class c = UserDao.class; // 1、知道类名 使用.class获取类
Class d = userDao.getClass(); // 2、知道对象 使用.getClass()获取类
Class m = null; // 3、知道类 使用class.forName("")获取类
try {
m = Class.forName("com.description.dao.UserDao");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} System.out.println("c d是否相等 : " + (c==d));
System.out.println("c m是否相等 : " + (c==m)); try {
UserDao ud = (UserDao) c.newInstance(); // 通过反射实例化一个对象,前提是UserDao必须有一个默认的无参构造方法
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}

2、动态加载类实例

新建四个类,一个Software接口,另外新建两个类继承该接口。

Software.java

 package com.hua.reflect;

 /**
* Created by 华天 on 2016/06/06.
*/
public interface Software {
public void show();
}

Word.java

 package com.hua.reflect;

 /**
* Created by 华天 on 2016/06/06.
*/
public class Word implements Software{ @Override
public void show() {
System.out.println("实现wold功能");
}
}

Excel.java

 package com.hua.reflect;

 /**
* Created by HuaTian on 2016/06/06.
*/
public class Excle implements Software {
@Override
public void show() {
System.out.println("实现Excel功能");
}
}

JavaReflect.java

  /**
* 动态加载类
*/
public static void getClass(String className) {
Software software = null;
try {
Class c = Class.forName("com.hua.reflect."+className);// 获取类
software = (Software) c.newInstance(); // 实例化类
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
software.show(); }
public static void main(String[] args){ /**
* 编译加载类属于静态加载类,运行加载类属于动态加载类
* new 对象属于静态加载类,在编译时期就要加载所有可能用到的类。
* 通过使用动态加载类,类在使用时加载,不使用不加载。
*
*/
JavaReflect.getClass("Word");

知识点:

  1、编译加载类属于静态加载类,运行加载类属于动态加载类。

  2、new 对象属于静态加载类,在编译时期就要加载所有可能用到的类。

  3、通过使用动态加载类,类在使用时加载,不使用不加载。

  4、void 等关键字都有类类型。

  5、获取类类型后就能获取类的相关信息。

  6、反射的操作都是编译后的操作。

  7、Java中的泛型是防止错误输入的,只在编译时期有效。ArrayList<String>  == ArrayList

      编译完成后泛型就不存在了,反射可以绕过编译将信息添加进去。

3、获取类中的相关信息

  新建一个ClassUtil.java 帮助类

 /**
* Created by 10113513 on 2016/06/06.
*/
public class ClassUtil { /**
* 显示类的相关信息
* @param obj
*/
public static void classMessage(Object obj) {
Class cs = obj.getClass();
System.out.println("类的全名称----------->" + cs.getName());
System.out.println("类的简写名称--------->" + cs.getSimpleName());
} /**
* 显示类中声明的方法
* @param obj
*/
public static void getMethods(Object obj){
Class cs = obj.getClass();
System.out.println("-------"+cs.getName()+"类中的方法");
Method[] methods = cs.getDeclaredMethods();
String show;
for (Method md : methods) {
show = md.getName() + md.getReturnType() + "(";
Class[] paramType = md.getParameterTypes();
for (Class c : paramType) {
show += c.getSimpleName() + ",";
}
show +=")";
System.out.println(show);
}
} /**
* 获取类的成员变量
* 只能获取公有的成员变量
* @param obj
*/
public static void getFiled(Object obj){
Class cs = obj.getClass();
System.out.println("-------"+cs.getName()+"类中的成员变量--------");
Field[] fds = cs.getFields();
for (Field fd:fds) {
System.out.println(fd.getName());
}
} /**
* 获取类中的构造函数
* @param obj
*/
public static void getConstructor(Object obj){
Class cs = obj.getClass();
System.out.println("-------"+cs.getName()+"类中的构造函数");
Constructor[] ctrs = cs.getConstructors();
String show = "";
for (Constructor ctr:ctrs) {
show += ctr.getName()+"(";
Parameter[] pars = ctr.getParameters();
for (Parameter par:pars) {
show += par.getName()+",";
}
show +=")";
System.out.println(show);
}
} }

4、获取方法的相关信息(获取的public的方法)

  1>方法名和参数列表决定了方法的唯一性

  2>方法反射的操作,method.invoke(对象,参数列表)

    1>> 方法没有返回值返回null,又返回值返回具体返回值。

    2>> 方法有参数列表就写成method.invoke(a1,int.class,int.class)  两个参数为例,

       没有参数直接写成method.invoke(a1,int.class,int.class) 。

5、整体代码

JavaReflect.java

 package com.hua.reflect;

 import com.description.dao.UserDao;

 /**
* Created by 华天 on 2016/06/06.
*/
public class JavaReflect {
public String animal;
private int num;
protected boolean isOk; public JavaReflect(){ }
public JavaReflect(String a){
System.out.println("do someThing");
} /**
* 动态加载类
* @param className
*/
public static void getClasses(String className) {
Software software = null;
try {
Class c = Class.forName("com.hua.reflect." + className);// 获取类
software = (Software) c.newInstance(); // 实例化类
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
software.show(); } /**
* 测试
* @param str
*/
public void test(String str) {
System.out.println("这是全部大写的测试方法:"+str.toUpperCase());
}
/**
* 测试1
*/
public void test1() {
System.out.println("这是全部小写的测试方法:"+"LIuBaoHua".toLowerCase());
} public static void main(String[] args) {
/*java 反射机制*/
// 获取类的方法
UserDao userDao = new UserDao();
Class c = UserDao.class; // 1、知道类名 .class
Class d = userDao.getClass(); // 2、知道对象 .getClass()
Class m = null; // 3、知道类的路径直接 class.forName("");
try {
m = Class.forName("com.description.dao.UserDao"); // 动态加载类
} catch (ClassNotFoundException e) {
e.printStackTrace();
} System.out.println("c d是否相等 : " + (c == d));
System.out.println("c m是否相等 : " + (c == m));
System.out.println("打印类名称:\n" + c.getName() + "\n" + d.getName() + "\n" + m.getName());
System.out.println("不包含包名的类名称:\n" + c.getSimpleName() + "\n" + d.getSimpleName()+ "\n" + m.getSimpleName()); try { UserDao ud = (UserDao) c.newInstance(); // 通过反射实例化一个对象,前提是UserDao必须有一个默认的无参构造方法
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
/**
* 1、编译加载类属于静态加载类,运行加载类属于动态加载类
* 2、new 对象属于静态加载类,在编译时期就要加载所有可能用到的类。
* 3、通过使用动态加载类,类在使用时加载,不使用不加载。
* 4、void 等关键字都有类类型
* 5、获取类类型后就能获取类的相关信息
*/
JavaReflect.getClasses("Word"); ClassUtil.classMessage(new JavaReflect()); ClassUtil.getMethods(new JavaReflect()); ClassUtil.getFiled(new JavaReflect()); ClassUtil.getConstructor(new JavaReflect()); // 参数列表
Class[] parms = new Class[]{String.class};
String[] strs = new String[]{"liubaohua"};
// 测试有参数
ClassUtil.getMethod(new JavaReflect(),"test",parms,strs);
// 测试无参数
ClassUtil.getMethod(new JavaReflect(),"test1",null,null); } }

ClassUtil.java

 package com.hua.reflect;

 import java.lang.reflect.*;

 /**
* Created by 华天 on 2016/06/06.
*/
public class ClassUtil { /**
* 显示类的相关信息
* @param obj
*/
public static void classMessage(Object obj) {
Class cs = obj.getClass();
System.out.println("类的全名称----------->" + cs.getName());
System.out.println("类的简写名称--------->" + cs.getSimpleName());
} /**
* 显示类中声明的方法
* @param obj
*/
public static void getMethods(Object obj){
Class cs = obj.getClass();
System.out.println("-------"+cs.getName()+"类中的方法");
Method[] methods = cs.getDeclaredMethods();
String show;
for (Method md : methods) {
show = md.getName() + md.getReturnType() + "(";
Class[] paramType = md.getParameterTypes();
for (Class c : paramType) {
show += c.getSimpleName() + ",";
}
show +=")";
System.out.println(show);
}
} /**
* 获取类的成员变量
* 只能获取公有的成员变量
* @param obj
*/
public static void getFiled(Object obj){
Class cs = obj.getClass();
System.out.println("-------"+cs.getName()+"类中的成员变量--------");
Field[] fds = cs.getFields();
for (Field fd:fds) {
System.out.println(fd.getName());
}
} /**
* 获取类中的构造函数
* @param obj
*/
public static void getConstructor(Object obj){
Class cs = obj.getClass();
System.out.println("-------"+cs.getName()+"类中的构造函数");
Constructor[] ctrs = cs.getConstructors();
String show = "";
for (Constructor ctr:ctrs) {
show += ctr.getName()+"(";
Parameter[] pars = ctr.getParameters();
for (Parameter par:pars) {
show += par.getName()+",";
}
show +=")";
System.out.println(show);
}
} /**
* 获取特定的方法
* @param obj 类
* @param mdName 方法名
* @param parms 参数列表
* @param objs 传入参数
*/
public static void getMethod(Object obj,String mdName,Class[] parms,Object[] objs){
Class cs = obj.getClass();
System.out.println("----------"+cs.getName()+"类中的具体方操作------------");
try {
JavaReflect ncs = (JavaReflect) cs.newInstance();
// getDeclaredMethod(方法名,参数列表);
Method md = null;
if(parms == null){
md = cs.getDeclaredMethod(mdName);
// 调用方法
md.invoke(ncs);
}else{
md = cs.getDeclaredMethod(mdName,parms);
// 调用方法
md.invoke(ncs,objs);
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} } }

  JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用

对象的方法的功能称为java语言的反射机制。

  

Java反射机制--笔记的更多相关文章

  1. java反射机制(笔记)

    java反射机制就是获取出class的相应方法 例如 获取构造函数: 模版: Class test = Class.forName("cn.test.Person");//得到相应 ...

  2. Java分享笔记:关于Java反射机制

    [1] 关于Java反射机制的概述 1.反射机制的概念:允许程序在执行期,借助于反射相关的API,取得任何类的内部信息,并能直接操作任意对象内部的属性和方法. 2.与反射相关的主要的API:java. ...

  3. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  4. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  5. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  6. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  7. Java反射机制专题

    ·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...

  8. java反射机制深入详解

    java反射机制深入详解  转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...

  9. Java反射机制DOME

    Java反射机制 public class TestHibernate { @Test public void TestHb(){ try { Class cs = Class.forName(&qu ...

随机推荐

  1. iOS开发-plist文件增删改查

    plist第一次看到这个后缀名文件的时候感觉怪怪的,不过接触久了也就习以为常了,plist是Property List的简称可以理解成属性列表文件,主要用来存储串行化后的对象的文件.扩展名为.plis ...

  2. JSON学习资料整理

    1.什么是JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使 ...

  3. Java基础(四):Java Number & Math 类、Character 类、String 类、StringBuffer & StringBuilder 类

    一.Java Number & Math 类: 1.Number类: 一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte.int.long.double 等.然而,在实际开发 ...

  4. IOS UITableView分组列表

    UITableView有两种风格:UITableViewStylePlain和UITableViewStyleGrouped.这两者操作起来其实并没有本质区别,只是后者按分组样式显示前者按照普通样式显 ...

  5. Android -- SlidingMenu

    实现原理 在一个Activity的布局中需要有两部分,一个是菜单(menu)的布局,一个是内容(content)的布局.两个布局横向排列,菜单布局在左,内容布局在右.初始化的时候将菜单布局向左偏移,以 ...

  6. Typescript declaration: Merge a class and an interface

    参考: https://stackoverflow.com/questions/47670959/typescript-declaration-merge-a-class-and-an-interfa ...

  7. mybatis如何根据mapper接口生成其实现类(springboot)

    序 mybatis里头给sqlSession指定执行哪条sql的时候,有两种方式,一种是写mapper的xml的namespace+statementId,如下: public Student fin ...

  8. [Webpack] Analyze a Production JavaScript Bundle with webpack-bundle-analyzer

    Bundle size has a huge impact on JavaScript performance. It's not just about download speed, but all ...

  9. 7. Add song to Phone

    package com.example.thenewboston; import android.app.Activity; import android.media.MediaPlayer; imp ...

  10. ZH奶酪:PHP判断图片格式的7种方法

    以图片 $imgurl = "http://www.php10086.com/wp-content/themes/inove/img/readers.gif"; 为例: 思路1. ...