基础的理论知识就不写了,直接来些代码实战吧!
package com.Student;
public class Student {
private String name;
public long schoolNum;
Student(String s,long x){
this.name=s;
this.schoolNum=x;
}
public void show(){
System.out.println(name+" "+schoolNum);
}
public static int show(int x,int y){
System.out.println(x+y);
return x+y;
}
}
先是一个需要反射的一个Student类。
反射的具体代码如下:
package com.company;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) {
try {
System.out.println("run -1");
Class StudentClazz=Class.forName("com.Student.Student");
System.out.println("run 0");
Constructor ct=StudentClazz.getDeclaredConstructor(String.class,long.class);
ct.setAccessible(true);
Object ob=ct.newInstance("曾国庆",123456789);
System.out.println("run 1");
Method method=StudentClazz.getMethod("show");
System.out.println("run 2");
method.invoke(ob);
Method method1=StudentClazz.getMethod("show",int.class,int.class);
method1.invoke(null,6,8);
}catch (Exception e){
System.out.println(e.getStackTrace());
}
}
}
其中
ct.setAccessible(true);
是因为反射的构造方法它没有声明为 public ,所以这里需要暴力破解一下
运行结果如下:
run -1
run 0
run 1
run 2
曾国庆 123456789
14
当时加 run的标记是因为之前运行不太成功。
首先当时报错为:
警告错误:
Main.java使用了未经检查或不安全的操作。
Information:java: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
感觉没什么错误但是为什么就是报错呢?
其实这个是因为 泛型的原因
Class StudentClazz=Class.forName("com.Student.Student");
改成:
Class<?> StudentClazz=Class.forName("com.Student.Student");
就不会报错了。
其次当时加run 的TAG是因为一直运行不成功
当时脑残了 。 包名写成了 “com.Student”
哎一大败笔 其实最好的习惯还是不要把包名和类名写成相同的比较好。
至于那个姓名“曾国庆”是谁,这里就不多说,知道是我的一个同学就行了。
0.0
冲冲冲!!!!