1. 1 package Demo;
  2. 2
  3. 3 import java.lang.reflect.Constructor;
  4. 4 import java.lang.reflect.Field;
  5. 5 import java.lang.reflect.InvocationTargetException;
  6. 6 import java.lang.reflect.Method;
  7. 7 import java.lang.reflect.Modifier;
  8. 8
  9. 9 public class Test {
  10. 10
  11. 11 public static void main(String[] args) {
  12. 12 Class clazz;
  13. 13 try {
  14. 14 //01:clazz = Class.forName("Demo.Student");
  15. 15 //02:clazz=Student.class;
  16. 16 clazz=new Student().getClass().getSuperclass();//03:并获取父类
  17. 17 System.out.println(clazz);
  18. 18 //获取基本数据类型的类 byte short int long float double boolean char
  19. 19 clazz=Byte.TYPE;
  20. 20 //输出byte
  21. 21 System.out.println(clazz);
  22. 22 clazz=Short.TYPE;
  23. 23 clazz=Integer.TYPE;
  24. 24 clazz=Long.TYPE;
  25. 25 clazz=Float.TYPE;
  26. 26 clazz=Double.TYPE;
  27. 27 clazz=Boolean.TYPE;
  28. 28 clazz=Character.TYPE;
  29. 29
  30. 30 //获取基本数据类型本身的类 class java.lang.Byte
  31. 31 clazz=Byte.class;
  32. 32 System.out.println(clazz);
  33. 33 clazz=Short.class;
  34. 34 clazz=Integer.class;
  35. 35 clazz=Long.class;
  36. 36 clazz=Float.class;
  37. 37 clazz=Double.class;
  38. 38 clazz=Boolean.class;
  39. 39 clazz=Character.class;
  40. 40
  41. 41 //获取数组对应的类 例如下为class java.lang.String
  42. 42 String [] name=new String[8];
  43. 43 clazz=String[].class;
  44. 44 System.out.println(clazz);
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49 //获取类中的构造方法
  50. 50 //获取public级别的构造方法
  51. 51 clazz=Class.forName("Demo.Student");
  52. 52 //Constructor[] constructors=clazz.getConstructors();
  53. 53 /*for (Constructor constructor : constructors) {
  54. 54 System.out.println(constructor);
  55. 55 }*/
  56. 56
  57. 57 //获取所有的构造方法
  58. 58 Constructor[] constructors=clazz.getDeclaredConstructors();
  59. 59 for (Constructor constructor : constructors) {
  60. 60 System.out.println(constructor);
  61. 61 }
  62. 62
  63. 63 //获取单个public级别的构造方法
  64. 64 Constructor c=clazz.getConstructor(Integer.TYPE);
  65. 65
  66. 66 //获取各种级别的某个构造方法
  67. 67 c=clazz.getDeclaredConstructor(String.class);
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77 //使用某个构造方法创建对象
  78. 78 c.setAccessible(true);
  79. 79 Object object=c.newInstance("小李");//相当于上转型对象
  80. 80 System.out.println(object);
  81. 81
  82. 82 //直接使用类创建对象,局限与无参
  83. 83 Object obj=clazz.newInstance();
  84. 84 System.out.println(obj);
  85. 85 //获取对应构造方法的参数对应的类数组
  86. 86 Class [] types=c.getParameterTypes();
  87. 87 for (Class type : types) {
  88. 88 //System.out.println(type);
  89. 89 }
  90. 90
  91. 91 //获取构造方法所在的类
  92. 92 Object class1=c.getDeclaringClass();
  93. 93 //System.out.println(class1);
  94. 94
  95. 95 //获取构造方法的访问权限
  96. 96 int result=c.getModifiers();
  97. 97 String authority=Modifier.toString(result);
  98. 98 //System.out.println(authority);
  99. 99
  100. 100 //获取构造方法的名字
  101. 101 String constructorName=c.getName();
  102. 102 //System.out.println(constructorName);
  103. 103
  104. 104
  105. 105
  106. 106
  107. 107
  108. 108
  109. 109
  110. 110
  111. 111
  112. 112
  113. 113
  114. 114 //获取public级别的方法 并且会获取到继承的public的方法
  115. 115 Method [] methhods=clazz.getMethods();
  116. 116 for (Method method : methhods) {
  117. 117 //System.out.println(method.getName());
  118. 118 }
  119. 119
  120. 120 //获取本类中的所有的方法
  121. 121 Method [] methods1=clazz.getDeclaredMethods();
  122. 122 for (Method method : methods1) {
  123. 123 //System.out.println(method.getName());
  124. 124 }
  125. 125
  126. 126
  127. 127 //调用类中的方法
  128. 128 //获取某个方法
  129. 129 Method m=clazz.getDeclaredMethod("getName", String.class,Integer.TYPE,int [].class);
  130. 130 //以下代表为调用了这个方法,并且传入了参数
  131. 131 m.setAccessible(true);//一般这个方法是私有的才会设置
  132. 132 //m.invoke(clazz.getConstructor(Integer.TYPE).newInstance(15), "liyinxia",15,new int[] {0,1,2,3});
  133. 133
  134. 134 //获取方法所在的类
  135. 135 Class class2 = m.getDeclaringClass();
  136. 136 //System.out.println(class2);
  137. 137
  138. 138 //获取方法的访问权限
  139. 139 /*int res=m.getModifiers();
  140. 140 String authorityName=Modifier.toString(res);
  141. 141 System.out.println(authorityName);*/
  142. 142
  143. 143 //获取方法的名字
  144. 144 /*String name3=m.getName();
  145. 145 System.out.println(name3);*/
  146. 146
  147. 147 //获取方法的参数
  148. 148 /*Object [] parameterTypes=m.getParameterTypes();
  149. 149 for (Object parameterType : parameterTypes) {
  150. 150 System.out.println(parameterType);
  151. 151 }*/
  152. 152
  153. 153
  154. 154 //获取方法的返回值类型
  155. 155 Class returnType=m.getReturnType();
  156. 156 //System.out.println(returnType);
  157. 157
  158. 158 //返回由Method对象表示方法抛出异常类型对应Class对象组成的数组
  159. 159 Class [] exceptionTypes = m.getExceptionTypes();
  160. 160 System.out.println("异常的个数"+exceptionTypes.length);
  161. 161 /*for (Class exceptionType : exceptionTypes) {
  162. 162 System.out.println(exceptionType);
  163. 163 }*/
  164. 164
  165. 165
  166. 166
  167. 167
  168. 168 //获取属性
  169. 169 Field shuXing=clazz.getField("name");
  170. 170
  171. 171 Object instance=clazz.getDeclaredConstructor().newInstance();
  172. 172 //设置属性的值
  173. 173 shuXing.set(instance, "xiaowang");
  174. 174 //获取属性的值
  175. 175 String name4=(String) shuXing.get(instance);
  176. 176 System.out.println(name4);
  177. 177
  178. 178
  179. 179
  180. 180 } catch (NoSuchMethodException e) {
  181. 181 e.printStackTrace();
  182. 182 } catch (ClassNotFoundException e) {
  183. 183 // TODO Auto-generated catch block
  184. 184 e.printStackTrace();
  185. 185 } catch (InstantiationException e) {
  186. 186 // TODO Auto-generated catch block
  187. 187 e.printStackTrace();
  188. 188 } catch (IllegalAccessException e) {
  189. 189 // TODO Auto-generated catch block
  190. 190 e.printStackTrace();
  191. 191 } catch (IllegalArgumentException e) {
  192. 192 // TODO Auto-generated catch block
  193. 193 e.printStackTrace();
  194. 194 } catch (InvocationTargetException e) {
  195. 195 // TODO Auto-generated catch block
  196. 196 e.printStackTrace();
  197. 197 } catch (NoSuchFieldException e) {
  198. 198 // TODO Auto-generated catch block
  199. 199 e.printStackTrace();
  200. 200 } catch (SecurityException e) {
  201. 201 // TODO Auto-generated catch block
  202. 202 e.printStackTrace();
  203. 203 }
  204. 204
  205. 205 }
  206. 206 }

以上代码已经非常详细的讲述了反射所具有的使用方法。。。。。。。。。仔细研究,其实也很简单,主要要理解反射存在的意义。

反射:是一种新的操作类中的构造方法,成员变量,普通方法的机制。

 _____________________________________________________________

package testJavaSE;
import java.lang.reflect.Method;
public class testMethodPerson {
public static void main(String[] args) throws Exception {
//获得Person的Class对象
Class<?> cls = testJavaSE.Person.class;//Class.forName("testJavaSE.Person");
//创建Person实例
Person p = (Person)cls.newInstance();
//获得Person的Method对象,参数为方法名,参数列表的类型Class对象
Method method = cls.getMethod("eat",String.class);
//invoke方法,参数为Person实例对象,和想要调用的方法参数
String value = (String)method.invoke(p,"肉");
//输出invoke方法的返回值
System.out.println(value);
//控制台输出:
//吃肉
//返回值

}
}

class Person{
public String eat(String food) {
System.out.println("吃"+food);
return "返回值";
}
}

______________________________________________________________
 
 
 
________________________________________________________________

eclipse中如何去除警告:Class is a raw type. References to generic type Class<T> should be parameterized

转自:  锐洋智能

 

解决前的源代码:

public class test {
public static void main(String args[]) {//入口
  try {

//假设在同一个包中建的一个javaBean: person
   Class c = Class.forName("person");//警告出现在这里
   try {
person factory = (person) c.newInstance();
    factory.setName("asdf");
    System.out.println(factory.getName());
   } catch (InstantiationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
}
}

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

  • 解决方法1:增加编译注解@SuppressWarnings("unchecked")

public class test {
@SuppressWarnings("unchecked")//增加在这里
public static void main(String args[]) {
  try {
  Class c = Class.forName("person");//警告出现在这里
   try {
    person factory = (person) c.newInstance();
    factory.setName("asdf");
...以下省略

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

  • 解决方法2:使用泛型通配符

public class test {
public static void main(String args[]) {//入口
  try {
   Class<?> c = Class.forName("person");//这里使用泛型通配符
   try {
    person factory = (person) c.newInstance();
    factory.setName("asdf");
    System.out.println(factory.getName());
...以下省略

java中反射知识点总结的更多相关文章

  1. Java中反射的三种常用方式

    Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...

  2. java中反射学习整理

    转载请注明:http://blog.csdn.net/j903829182/article/details/38405735 反射主要是指程序能够訪问.检測和改动它本身的状态或行为的一种能力. jav ...

  3. Java中反射的实现方式

    所谓反射,是指在运行时状态中,获取类中的属性和方法,以及调用其中的方法的一种机制.这种机制的作用在于获取运行时才知道的类(Class)及其中的属性(Field).方法(Method)以及调用其中的方法 ...

  4. 简单模拟Java中反射的应用场景

    有人说Java是一门静态语言.那么何为静态语言,动态语言又是什么? 1.动态语言 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以 被引进,已有的函数可以被删除或是其他结构上的变化 ...

  5. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  6. Java中反射与常用方法

    java通常是先有类再有对象,有对象我就可以调用方法或者属性. 反射其实是通过Class对象来调用类里面的方法.通过反射可以调用私有方法和私有属性.大部分框架都是运用反射原理.   如何获得Class ...

  7. Java中反射机制详解

    序言 在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射, ...

  8. java中反射讲解及实例

    Java反射机制详解 java 反射 定义 功能 示例 概要: Java反射机制详解 | |目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实 ...

  9. java中部分知识点的验证实现

    java中运算符重载 满足以下条件的两个或多个方法构成"重载"关系: (1)方法名相同: (2)参数类型不同,参数个数不同,或者是参数类型的顺序不同. 注意:方法的返回值不作为方法 ...

随机推荐

  1. 超快速度下载MNIST数据集

    Download mnist dataset and extract in 1 second! For Caffe users: create $CAFFE/data/mnist/get_mnist_ ...

  2. Linux shell sed命令使用

    Linux处理文本文件的工具:     grep        过滤文件内容     sed            编辑文件内容     awk             正则表达式Regex      ...

  3. 性能测试基础---ant集成1

    ·Jmeter的命令行与ant等的集成.·为什么需要使用Jmeter的命令行模式(Non-GUI).·为了更好的利用负载机的资源.GUI模式会消耗更多的系统资源.·为了更好的掌握jmeter和其它工具 ...

  4. 极简让ingress-nginx最新版(0.25.0)跑起来

    裸步骤: 一,manadatory.yaml apiVersion: v1 kind: Namespace metadata: name: ingress-nginx labels: app.kube ...

  5. Kustomize安装配置入门文档

    一,简介 kustomize是sig-cli的一个子项目,它的设计目的是给kubernetes的用户提供一种可以重复使用同一套配置的声明式应用管理,从而在配置工作中用户只需要管理和维护kubernet ...

  6. 使用msRequestFullscreen全屏在IE 11无效

    问题产生原因:项目需要实现百度地图全屏的功能, 通过github上http://robnyman.github.io/fullscreen/这个demo初步实现在这个功能,在谷歌上也完美运行,而在ie ...

  7. jquery保存cookie,php读取cookie操作

    //保存时间 var Days = 30; var exp = new Date(); exp.setTime(exp.getTime() + Days*24*60*60*1000); //保存内容, ...

  8. 【oracle】定时任务存储过程带参

    DECLAREX NUMBER;--随机一个job编号BEGINSYS.DBMS_JOB.SUBMIT( job => X,what => 'SHEVERYDAYJOB(TO_CHAR(S ...

  9. postfix发邮件失败,日志和postqueue -p提示Connection refused

    1. postfix服务未启动 2. /etc/postfix/main.cf文件中未设置inet_interfaces = all

  10. 如何使用离线存储(localStorage)?

    1.存储数据:localStorage.setItem("属性","属性值") 2.获取本地存储的值:localStorage.getItem("属性 ...