反射-Reflect

测试用到的代码

1.接口 Person.java

 public interface Person {
Boolean isMale = true; void say(); void eat(); void sleep();
}

2. Man.java

 public class Man implements Person {
private String name;
private int age; public Man() {
} public Man(String name) {
this.name = name;
} public Man(int age) {
this.age = age;
} public Man(String name, int age) {
this.name = name;
this.age = age;
} private String test1(String name, int age) {
return name + String.valueOf(age);
} @Override
public void say() {
System.out.println("I am Man");
} public void sayName(String name) {
System.out.println("I am " + name);
} public static void sayStatic() {
System.out.println("This is a static method");
} public static void sayStatic2(String name) {
System.out.println("This is a static method,I am " + name);
} @Override
public void eat() {
System.out.println("Man eat 5 breads");
} @Override
public void sleep() {
System.out.println("Man need sleep 8 hours");
} @Override
public String toString() {
return this.name + ":" + this.age;
}
}

3. Women.java

 public class Women implements Person {
@Override
public void say() {
System.out.println("I am women");
} @Override
public void eat() {
System.out.println("Women eat 3 breads");
} @Override
public void sleep() {
System.out.println("Women sleep 8 hours");
}
}

4. Child.java

 public class Child extends Man {

     @Override
public void say() {
System.out.println("I am Child");
}
}

通过反射,获取到类的信息和操作

1.获取到类完整的包名和类名

 public class ReflectTest {
public static void main(String[] args) {
Class<?> c = Man.class;
String name = c.getName();
System.out.println(name);
}
}

结果:

cc.lijingbo.script.reflect.Man

2.实例化 Class 类对象,有三种方法可以获取到 Class 对象。

 public class ReflectTest {
public static void main(String[] args) {
Class<?> c1 = null;
Class<?> c2 = null;
Class<?> c3 = null; c1 = Man.class;
Man man = new Man();
c2 = man.getClass();
try {
c3 = Class.forName("cc.lijingbo.script.reflect.Man");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} System.out.println("类的名称:" + c1.getName());
System.out.println("类的名称:" + c2.getName());
System.out.println("类的名称:" + c3.getName());
}
}

结果:

类的名称:cc.lijingbo.script.reflect.Man
类的名称:cc.lijingbo.script.reflect.Man
类的名称:cc.lijingbo.script.reflect.Man

3. Class 类实例化 Man 类,通过 Man 类的无参构造方法

 public class ReflectTest {
public static void main(String[] args) {
Class<?> c3 = null;
try {
c3 = Class.forName("cc.lijingbo.script.reflect.Man");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
Man man = (Man) c3.newInstance();
man.say();
man.eat();
man.sleep();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}

结果:

I am Man
Man eat 5 breads
Man need sleep 8 hours

[注意]:假如类中定义了构造方法,且没有无参构造方法,使用 newInstance() 会报错,无法实例化。

Man.java 去掉无参构造方法,然后使用 Class 类实例化 Man 类

Test.java

 public class ReflectTest {
public static void main(String[] args) {
Class<?> c3 = null;
try {
c3 = Class.forName("cc.lijingbo.script.reflect.Man");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
Man man = (Man) c3.newInstance();
man.say();
man.eat();
man.sleep();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
 

结果:

 java.lang.InstantiationException: cc.lijingbo.script.reflect.Man
at java.lang.Class.newInstance(Class.java:423)
at cc.lijingbo.script.reflect.ReflectTest.main(ReflectTest.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.NoSuchMethodException: cc.lijingbo.script.reflect.Man.<init>()
at java.lang.Class.getConstructor0(Class.java:3074)
at java.lang.Class.newInstance(Class.java:408)
... 6 more

分析:

可以看到异常的是原因: Caused by: java.lang.NoSuchMethodException: cc.lijingbo.script.reflect.Man.<init>(),并重新抛出了 java.lang.InstantiationException的异常。引起的原因就是没有无参构造方法造成的。

4. 调用 Man 类中的所有构造方法,可以通过各种构造方法实例化 Man 类。

[注意]:反射获取到的所有构造方法中,注意在数组中的顺序。

Test.java

 public class ReflectTest {
public static void main(String[] args) {
Class<?> c = null;
try {
c = Class.forName("cc.lijingbo.script.reflect.Man");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Man m1 = null;
Man m2 = null;
Man m3 = null;
Man m4 = null;
Constructor<?>[] constructors = c.getConstructors();
try {
m1 = (Man) constructors[3].newInstance();
m2 = (Man) constructors[2].newInstance("Jerome");
m3 = (Man) constructors[1].newInstance(20);
m4 = (Man) constructors[0].newInstance("Jerome1", 21);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(m1);
System.out.println(m2);
System.out.println(m3);
System.out.println(m4);
}
}

结果:

null:0
Jerome:0
null:20
Jerome1:21

5. 获得 Man 类中的全部构造函数

 public class ReflectTest {
public static void main(String[] args) {
Class<?> c = null;
try {
c = Class.forName("cc.lijingbo.script.reflect.Man");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Constructor<?>[] constructors = c.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
}
}

结果:

 public cc.lijingbo.script.reflect.Man(java.lang.String,int)
public cc.lijingbo.script.reflect.Man(int)
public cc.lijingbo.script.reflect.Man(java.lang.String)
public cc.lijingbo.script.reflect.Man()

 

6. 返回类实现的接口

 public class ReflectTest {
public static void main(String[] args) {
Class<?> c = null;
try {
c = Class.forName("cc.lijingbo.script.reflect.Man");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Class<?>[] interfaces = c.getInterfaces();
for (Class in : interfaces) {
System.out.println(in.getName());
}
}
}

结果:

cc.lijingbo.script.reflect.Person

7. 取得 Child 类的父类

Child.java

 public class Child extends Man {

     @Override
public void say() {
System.out.println("I am Child");
}
}

Test.java

 public class ReflectTest {
public static void main(String[] args) {
Class<?> c = null;
try {
c = Class.forName("cc.lijingbo.script.reflect.Child");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Class<?> superclass = c.getSuperclass();
System.out.println(superclass.getName());
}
}

结果:

cc.lijingbo.script.reflect.Man

8.  获取构造方法的修饰符

 public class ReflectTest {
public static void main(String[] args) {
Class<?> c = null;
try {
c = Class.forName("cc.lijingbo.script.reflect.Man");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Constructor<?>[] constructors = c.getConstructors();
for (int i = 0; i < constructors.length; i++) {
Class[] parameterTypes = constructors[i].getParameterTypes();
int modifiers = constructors[i].getModifiers();
System.out.print(Modifier.toString(modifiers) + " ");
System.out.print(constructors[i].getName());
System.out.println("(");
for (int j = 0; j < parameterTypes.length; ++j) {
System.out.print(parameterTypes[j].getName() + " arg" + i);
if (j < parameterTypes.length - 1) {
System.out.print(",");
}
}
System.out.println("){}");
}
}
}

结果:

 public cc.lijingbo.script.reflect.Man(
java.lang.String arg0,int arg0){}
public cc.lijingbo.script.reflect.Man(
int arg1){}
public cc.lijingbo.script.reflect.Man(
java.lang.String arg2){}
public cc.lijingbo.script.reflect.Man(
){}

9. 取得 Man 类的全部属性

 public class ReflectTest {
public static void main(String[] args) {
Class<?> c = null;
try {
c = Class.forName("cc.lijingbo.script.reflect.Man");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Field[] declaredFields = c.getDeclaredFields();
for (Field field : declaredFields) {
int modifiers = field.getModifiers();
String type = Modifier.toString(modifiers);
Class<?> fieldType = field.getType();
System.out.println(type + " " + fieldType + " " + field.getName());
}
System.out.println("..........");
Field[] fields = c.getFields();
for (Field field : fields) {
int modifiers = field.getModifiers();
String type = Modifier.toString(modifiers);
Class<?> fieldType = field.getType();
System.out.println(type + " " + fieldType + " " + field.getName());
}
}
}

结果:

private class java.lang.String name
private int age
..........
public static final class java.lang.Boolean isMale

10.调用 Man 类中的方法,有参方法,无参方法,静态无参方法和静态有参方法

 public class ReflectTest {
public static void main(String[] args) {
Class<?> c = null;
try {
c = Class.forName("cc.lijingbo.script.reflect.Man");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} //调用带参的方法
try {
Method sayName = c.getMethod("sayName", String.class);
sayName.invoke(c.newInstance(), "Jerome");
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} //调用无参的方法
try {
Method say = c.getMethod("say");
say.invoke(c.newInstance());
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} //调用静态无参方法
try {
Method sayStatic = c.getMethod("sayStatic");
sayStatic.invoke(null);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} //调用静态带参方法
try {
Method sayStatic2 = c.getMethod("sayStatic2", String.class);
sayStatic2.invoke(null,"Jerome");
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} }
}

结果:

I am Jerome
I am Man
This is a static method
This is a static method,I am Jerome

11. 获取到 Man 类所有的方法,及方法的修饰符,返回值和参数

 public class ReflectTest1 {
public static void main(String[] args) {
Class<?> c = Man.class;
Method[] methods = c.getDeclaredMethods();
for (Method method : methods) {
StringBuffer sb = new StringBuffer();
//获取到方法的修饰符
String modifier = Modifier.toString(method.getModifiers());
sb.append(modifier + " ");
Class<?> methodReturnType = method.getReturnType();
//获取到方法的返回类型,没有返回值时为null
String returnType = methodReturnType.getName();
String methodName = method.getName();
if (returnType == null) {
sb.append("void ");
} else {
sb.append(returnType + " ");
}
sb.append(methodName).append("(");
Class<?>[] parameterTypes = method.getParameterTypes();
for (Class parameter : parameterTypes) {
String name = parameter.getName();
sb.append(name).append(",");
}
sb.append(")");
System.out.println(sb.toString());
}
}
}

结果:

public java.lang.String toString()
public void sleep()
public void say()
private java.lang.String test1(java.lang.String,int,)
public static void sayStatic()
public void eat()
public void sayName(java.lang.String,)
public static void sayStatic2(java.lang.String,)

12. 获取到类加载器

 public class ReflectTest2 {
public static void main(String[] args) {
Class<?> c = Man.class;
//获取到 classloader
ClassLoader classLoader = c.getClassLoader();
//通过获取到classloader的类类型,得到classloader的名称
String name = classLoader.getClass().getName();
System.out.println(name);
}
}

结果:

sun.misc.Launcher$AppClassLoader

13. 修改成员变量的值

 public class ReflectTest3 {
public static void main(String[] args) {
Class<?> c = Man.class;
try {
Field name = c.getDeclaredField("name");
name.setAccessible(true);
Object o = c.newInstance();
name.set(o,"Haha");
System.out.println(name.get(o));
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}

结果:

Haha

14. 获取数组相关信息

 public class ReflectTest4 {
public static void main(String[ ] args){
int[] temp = {1,2,4,5,7};
Class<?> c = temp.getClass();
Class<?> componentType = c.getComponentType();
System.out.println("数组的类型:"+componentType.getName());
System.out.println("数组的长度:"+Array.getLength(temp));
System.out.println("数组第三个位置:"+Array.get(temp,2));
Array.set(temp,2,44);
System.out.println("修改后的数组第三个位置:"+Array.get(temp,2));
}
}

结果:

数组的类型:int
数组的长度:5
数组第三个位置:4
修改后的数组第三个位置:44

Java 基础-反射的更多相关文章

  1. Java基础-反射(reflect)技术详解

    Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制  如下图所示,JVM类加载机制分为五个部分 ...

  2. Java基础——反射

    今天学到Java基础中的反反射.依照我学习后的个人理解呢,反射就是一套获取类.属性.方法等的工具吧.(其实,感觉学完反射后,有点像喝凉水,解渴但确实我也没体会出它有什么味道,我可能没有学到精髓吧.自己 ...

  3. Java基础反射(二)

    原文地址http://blog.csdn.net/sinat_38259539/article/details/71799078 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Cla ...

  4. java基础(反射,注解,多线程,juc)

    JAVA基础 java反射 class对象 三种方式获取class加载时对象 1.class.forName("全类名"):将字节码文件加载进内存,返回class对象 2.类名.c ...

  5. [java 基础]反射入门

    原文 概况 使用java的反射,可以让我们检查(或者修改)类,接口,字段,方法的特性.当你在编译期不知道他们的名字的时候非常有用. 除此之外,可以使用反射来创建实例,调用方法或者get/set 字段值 ...

  6. JAVA基础-反射机制

    什么是JAVA的反射机制 Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其 ...

  7. java基础-反射(细节)

    java面试题--java反射机制? Java反射机制的作用:1)在运行时判断任意一个对象所属的类.2)在运行时判断任意一个类所具有的成员变量和方法.3)在运行时任意调用一个对象的方法4)在运行时构造 ...

  8. Java基础—反射(转载)

    转载自: JAVA反射与注解 JAVA反射 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射机制是什么 反射 ...

  9. java基础——反射机制

    反射机制是什么 反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...

  10. Java基础—反射与代理(新手向)

    第1章 反射与代理 1.1 反射定义 一般情况下,需要一个功能的前提是遇到了某个问题,这里先列举一些问题,然后再通过反射是如何解决了这些问题,来引出反射的定义. 普通开发人员工作中最常见的问题:需要生 ...

随机推荐

  1. Basic knowledge of javaScript (keep for myself)

    1. 函数表达式 JavaScript 函数可以通过一个表达式定义.eg. var x = function (a, b) {return a * b}; so: var x = function ( ...

  2. JAVA 对象数组,加载图片实例 分类: Java Game 2014-08-14 16:57 80人阅读 评论(0) 收藏

    主函数: package com.mywork; import java.awt.Color; import java.awt.Image; import javax.swing.ImageIcon; ...

  3. shader 汇编

    mad ro.xy v1.xyxx, l(1.000000,-1.000000,0.0000,0.000000), l(0.000000,1.000000,0.0000,0.000000) 这个东西真 ...

  4. 使用feof()函数判断文件是否结束

    课本上时这样写的:(用putchar(ch);代表对取出来的字符的处理.) while(!feof(fp)) { ch=fgetc(fp); putchar(ch); } 但是,这样写的话,fgetc ...

  5. FastDfs点滴

    1.centos安装后提示找不到libevent动态库 根据系统是64位版本还是32位版本,若是64位版本则默认回到 /usr/lib64 目录下查找,而对于32位则到 /usr/lib 目录下查找. ...

  6. 调用MYSQL存储过程实例

    PHP调用MYSQL存储过程实例 http://blog.csdn.net/ewing333/article/details/5906887 http://www.cnblogs.com/kkchen ...

  7. POJ 1665

    #include<iostream>//chengdacaizi 08.11.12 #include<iomanip> #define p 3.1415927 using na ...

  8. poj 3613(经过N条边的最短路)

    题目链接:http://poj.org/problem?id=3613 思路:我们知道如果矩阵A表示经过1条边的方案数,那么A^N矩阵就代表这经过N条边的方案数,而本题中要求经过N条边的最短距离,于是 ...

  9. pku 1703(种类并查集)

    题目链接:http://poj.org/problem?id=1703 思路;个人觉得本质上还是和带权并查集一样的,只不过多了一个MOD操作,然后就是向量关系图稍微改动一下就变成种类并查集了,对于本题 ...

  10. 矩阵快速幂 POJ 3735 Training little cats

    题目传送门 /* 题意:k次操作,g:i猫+1, e:i猫eat,s:swap 矩阵快速幂:写个转置矩阵,将k次操作写在第0行,定义A = {1,0, 0, 0...}除了第一个外其他是猫的初始值 自 ...