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

    有时候不用的指标的绝对值不能比,但是转转为百分比的形式就容易看出波动了,是数据分析的好用的一个分析函数 20:00:24 SYS@orcl> conn scott/tiger; Connecte ...

  2. JAVA concurrent包下Semaphore、CountDownLatch等用法

    CountDownLatch 跟join的区别 CountDownLatch用处跟join很像,但是CountDownLatch更加灵活,如果子线程有多个阶段a.b.c; 那么我们可以实现在a阶段完成 ...

  3. Python3和HTMLTestRunner生成html测试报告

    1.测试环境: Python3.5+unittest+HTMLTestRunner 2.下载HTMLTestRunner.py文件 下载地址 http://tungwaiyip.info/softwa ...

  4. 使用apache.tika判断文件类型

    一. 判断文件类型一般可采用两种方式 1. 后缀名判断 简单易操作,但无法准确判断类型 2. 文件头信息判断 通常可以判断文件类型,但有些文件类型无法判断(如word和excel头信息的前几个字节是一 ...

  5. pdf的使用遇到的问题

    http://blog.csdn.net/atluckstar/article/details/77688972 回答网友提问  2015-7-28 因为好多人问能不能显示中文的问题,我总结大致分为两 ...

  6. C语言里面"具有外部链接的静态变量"这里的"链接"是什么意思

    首先从静态变量说起. C语言里面静态变量有三种: 分别是外部链接性,内部链接性和无链接性.声明外部链接的变量的方法是在代码块外面声明它. 此变量是全局变量,多文件中亦可用.声明内部链接的变量的方法是在 ...

  7. 接口测试中,数据驱动时,参数各类型,空或None的处理

    天天说接口测试,天天说数据驱动,但网上的各种教程太烂,遇到实际情况就傻眼了. 来来来,我们看一个例子 假设,有下面这样一个接口,获取用户信息,可以带的参数如下: 用户名(uname) str(),非必 ...

  8. div垂直居中水平居中css

    width: 860px; height: 500px; position: absolute; margin-left: -430px; margin-top: -250px; top: 50%; ...

  9. three.js 测试1

    关键看一下里面的注释 代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /& ...

  10. [RN] 阿里 ant-design 菜单比较丰富 https://github.com/ant-design/ant-design-mobile

    阿里 ant-design  菜单比较丰富 https://github.com/ant-design/ant-design-mobile 天和风雨顺 地和五谷丰 人和事业旺 家和万事兴