zoukankan      html  css  js  c++  java
  • java高级篇

    Method对象可以得到任何一个类的任何方法的定义(只需要传入方法的名字和参数即可)

    class Ming {
        private void speak() {
            System.out.println("ff");
        }
    }
    
    public class Main {
        public static void main(String[] args) throws NoSuchMethodException {
            Method method = Ming.class.getDeclaredMethod("speak");
            System.out.println(method.toString());
        }
    }
    View Code

    有参数的话,需要int.class

    class Ming {
        void speak(int a) {
            System.out.println("ff");
        }
    }
    
    public class Main {
        public static void main(String[] args) throws NoSuchMethodException {
            Ming s = new Ming();
            Method method = s.getClass().getDeclaredMethod("speak", int.class);
            System.out.println(method);
        }
    }
    View Code

    输出   private void Ming.speak() 

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

    得到类的构造函数

    getConstructor只能得到public的

    import java.lang.reflect.Constructor;
    
    class Second {
        int a, b;
        public Second() {
            a = b = 1;
        }
        Second(int _a, int _b) {
            a = _a;
            b = _b;
        }
        void show() {
            System.out.println(a + b);
        }
    };
    public class Main {
        public static void main(String[] args) throws InterruptedException, NoSuchMethodException, SecurityException {
            Second second = new Second();
            System.out.println(second.toString());
            System.out.println(second.getClass().getConstructor().toString());
            // getConstructor只能用在public 的构造方法
            
            
            /*  输出 
                Second@7852e922
                public Second()
            */
        }
    }
    View Code

    getDeclaredConstructor可以得到所有的

    import java.lang.reflect.Constructor;
    
    class Second {
        int a, b;
        public Second() {
            a = b = 1;
        }
        Second(int _a, int _b) {
            a = _a;
            b = _b;
        }
        void show() {
            System.out.println(a + b);
        }
    };
    public class Main {
        public static void main(String[] args) throws InterruptedException, NoSuchMethodException, SecurityException {
            Second second = new Second();
            System.out.println(second.toString());
            System.out.println(second.getClass().getDeclaredConstructor(int.class, int.class).toString());
            // getConstructor只能用在public 的构造方法
            
            
            /*  输出 
                Second@7852e922
                Second(int,int)
            */
        }
    }
    View Code

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

    getField得到的是变量名

    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    class Ming {
        private void speak() {
            System.out.println("ff");
        }
        public int vb;
        public int a;
        public Ming() {}
    }
    
    public class Main {
        public static void main(String[] args) throws NoSuchMethodException {
            Ming ming = new Ming();
            Field[] fields = ming.getClass().getFields();
            for (Field field : fields) {
                System.out.println(field.toString());
            }
            //public int Ming.vb
            //public int Ming.a
        }
    }
    View Code

    可以得到单个的,传入名字就可以

    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    class Ming {
        private void speak() {
            System.out.println("ff");
        }
        private int vb;
        public int a;
        public Ming() {}
    }
    
    public class Main {
        public static void main(String[] args) throws Exception {
            Ming ming = new Ming();
            Field field = ming.getClass().getDeclaredField("vb");
            System.out.println(field.toString());
            
        }
    }
    View Code

    抛出异常,绝招,直接throw Expection即可,不用throw XXXExpection

    反射机制,大概就是得到名字,就可以得到所有东西,可以修改属性。

    得到一个类的名字,可以用forname方法生成他的一个对象。

    然后,可以用getField得到它的一个属性,也就是变量。

    然后用Field.set(对象名, val)就可以修改成功。也可以修改private的变量。超劲。

    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.math.BigInteger;
    import java.util.Scanner;
    
    class Ming {
        private int a;
        Ming() {
            
        }
        void speak() {
            System.out.println("fff");
        }
        int show() {
            return a;
        }
    }
    
    public class Main {
        public static void main(String[] args) throws Exception { // 666
            Class clazz = Class.forName("Ming");
            Ming s = (Ming)clazz.newInstance();
            Field field = clazz.getDeclaredField("a");
            field.setAccessible(true); //修改private
            field.set(s, 20);
            System.out.println(s.show());
        }
    }
    View Code
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.math.BigInteger;
    import java.util.Scanner;
    
    class Ming {
        private int a;
        Ming() {
            
        }
        void speak() {
            System.out.println("fff");
        }
        int show() {
            return a;
        }
    }
    
    public class Main {
        public static void main(String[] args) throws Exception { // 666
            Class clazz = Class.forName(Ming.class.getName()); //这样来
            Ming s = (Ming)clazz.newInstance();
            Field field = clazz.getDeclaredField("a");
            field.setAccessible(true); //修改private
            field.set(s, 20);
            System.out.println(s.show());
        }
    }
    View Code

    利用java反射得到一个类的所有东西,不能得到方法实现的内容

    import java.io.File;
    import java.io.PrintWriter;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.Scanner;
    
    class Person {
        private String name, sex, idNo;
        Integer age;
        Boolean isMerried;
        int a;
    
        public String getName() {
            return name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public String getIdNo() {
            return idNo;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public Boolean getIsMerried() {
            return isMerried;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public void setIdNo(String idNo) {
            this.idNo = idNo;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public void setIsMerried(Boolean isMerried) {
            this.isMerried = isMerried;
        }
    
        private void show(int a, int b, char c, int d) {
        }
    
        public Person() {
        }
    
        public Person(String idNo) {
            this.idNo = idNo;
        }
    
        public Person(String idNo, Integer fuck) {
        }
    
        public String toString() {
            return name + "  " + sex + " " + age + " " + idNo + " " + isMerried; // 需要两个空格?,因为中文,靠
        }
    }
    
    class PersonProxy {
        private Person T;
        private final String OUTPUT = "output.txt";
        private PrintWriter output = new PrintWriter(OUTPUT);
    
        PersonProxy(Person T) {
            this.T = T;
        }
    
        private void writeFile(String message) {
    
        }
    }
    
    public class Main {
        static private final String INPUT = "input.txt";
        static private final String OUTPUT = "output.txt";
        static private final String CMP = "java.lang.";
        static private final int MAXN = 200;
        
        static private int[] del = new int[MAXN];
        static private int DFN = 0;
        
        private static String getString(String str, String className) {
            ++DFN;
            for (int j = 0; j < str.length(); ++j) {
                if (del[j] == DFN)
                    continue;
                String t = "";
                if (j + 10 < str.length()) {
                    t = str.substring(j, j + 10);
                    if (t.compareTo(CMP) == 0) {
                        for (int k = j; k < j + 10; ++k)
                            del[k] = DFN;
                    }
                }
                if (j + className.length() + 1 < str.toString().length()) {
                    t = str.substring(j, j + className.length() + 1);
                    if (t.compareTo(className + ".") == 0) {
                        for (int k = j; k < j + className.length() + 1; ++k)
                            del[k] = DFN;
                    }
                }
            }
    
            String out = "	";
            for (int j = 0; j < str.length(); ++j) {
                if (del[j] == DFN)
                    continue;
                out += str.charAt(j);
            }
            return out + ";";
        }
    
        private static void showClassInformation(String className) throws Exception {
            System.out.println("class" + " " + className + " {");
            Class clazz = Class.forName(className);
            Field[] fs = clazz.getDeclaredFields();
            for (Field i : fs) {
                System.out.println(getString(i.toString(), className));
            }
            Constructor[] cs = clazz.getDeclaredConstructors();
            for (Constructor i : cs) {
                System.out.println(getString(i.toString(), className));
            }
            Method[] ms = clazz.getDeclaredMethods();
            for (Method i : ms) {
                System.out.println(getString(i.toString(), className));
            }
            System.out.println("}");
        }
    
        public static void getInstance(String className) throws Exception {
            Class clazz = Class.forName(className);
            Person ps = (Person) clazz.newInstance();
            ps.setIdNo("5122245566");
            ps.setName("张小平");
            ps.setAge(23);
            ps.setSex("Male");
            ps.setIsMerried(true);
            PrintWriter output = new PrintWriter(OUTPUT);
            output.println("idNo=" + ps.getIdNo());
            output.println("name=" + ps.getName());
            output.println("age=" + ps.getAge());
            output.println("sex=" + ps.getSex());
            output.println("isMerried=" + ps.getIsMerried());
            output.close();
        }
    
        public static void getFile(String className) throws Exception {
            Class clazz = Class.forName(className);
            Person ps = (Person) clazz.newInstance();
            Scanner input = new Scanner(new File(INPUT));
            String str;
            str = input.next();
            ps.setIdNo(str.substring(str.lastIndexOf('=') + 1, str.length()));
            str = input.next();
            ps.setName(str.substring(str.lastIndexOf('=') + 1, str.length()));
            str = input.next();
            ps.setAge(Integer.parseInt(str.substring(str.lastIndexOf('=') + 1, str.length())));
            str = input.next();
            ps.setSex(str.substring(str.lastIndexOf('=') + 1, str.length()));
            str = input.next();
            ps.setIsMerried(Boolean.parseBoolean(str.substring(str.lastIndexOf('=') + 1, str.length())));
    
            System.out.println(ps.toString());
            input.close();
        }
    
        
        public static void main(String[] args) throws Exception {
            showClassInformation("Person");
            getInstance("Person");
            getFile("Person");
        }
    }
    View Code

    文件追加操作

        public void writeFile(String methodName, String parm) throws IOException {
            output = new PrintWriter(new FileWriter(new File(OUTPUT), true)); // 文件追加
            String message = "时间: " + getNowTime() + " 方法名称: " + methodName + " 参数" + parm;
            output.println(message);
            output.close();
        }

    利用动态代理,需要的是设计一个接口,里面写了什么,就能代理出来。

    public interface Speakable {
        public void speak(String message);
        public String getName();
        public String getSex();
        public String getIdNo();
        public Integer getAge();
    
        public Boolean getIsMerried();
    
        public void setName(String name);
    
        public void setSex(String sex);
    
        public void setIdNo(String idNo);
    
        public void setAge(Integer age);
        public void setIsMerried(Boolean isMerried);
    }

    写一个这样的接口,必须只能是接口

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class MyProxy implements InvocationHandler {
        private Object proxied;
        MyProxy(Object proxied) {
            this.proxied = proxied;
        }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            method.invoke(this.proxied, args);
            System.out.println(PersonProxy.getNowTime()); //这一条就是
            return null;
        }
    }

    加上一条语句,就是每执行接口中的一个方法的时候,下面那句语句就能执行。所以就不需要在类中为每一个方法都写一句一毛一样的

            Person person = new Person();
            Speakable speakable = (Speakable)Proxy.newProxyInstance(Speakable.class.getClassLoader(), new Class[] {Speakable.class}, new MyProxy(person));
            speakable.setAge(2); //会输出时间
            System.out.println(person.getAge()); //不会输出时间

    然后这样,每调用接口的一个方法,都会输出当前的时间。

    这样做的好处就是,把一个对象,弄了一个代理给他,这样,那个代理做的东西,会直接影响那个对象的值,并且能够多输出一些你想要的东西。

    Map的使用方法(假)

    需要注意要判断后才能使用

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Scanner;
    
    import org.omg.PortableInterceptor.INACTIVE;
    class Student {
        private String idNo, name;
        private int score;
        public Student(String idNo, String name, int score) {
            super();
            this.idNo = idNo;
            this.name = name;
            this.score = score;
        }
        public String getIdNo() {
            return idNo;
        }
        public void setIdNo(String idNo) {
            this.idNo = idNo;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getScore() {
            return score;
        }
        public void setScore(int score) {
            this.score = score;
        }
        
    }
    class Score {
        private String course;
        private int score;
        public Score(String course, int score) {
            super();
            this.course = course;
            this.score = score;
        }
        public String getCourse() {
            return course;
        }
        public void setCourse(String course) {
            this.course = course;
        }
        public int getScore() {
            return score;
        }
        public void setScore(int score) {
            this.score = score;
        }
        
    }
    public class Main {
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            ArrayList<Student> st = new ArrayList<Student>();
            ArrayList<Score> sc = new ArrayList<Score>();
            Map<String, Integer> sumOfStudentScore = new HashMap<String, Integer>();
            Map<String, Integer> numberOfStudentSelect = new HashMap<String, Integer>();
            Map<String, Integer> mx = new HashMap<String, Integer>();
            Map<String, Integer> mi = new HashMap<String, Integer>();
            while (true) {
                System.out.println("请输入学生的学号、姓名、选修课程、课程成绩(学号是小数点结束输入)");
                String idNo = input.next();
                if (idNo.compareTo(".") == 0) break;
                String studentName = input.next();
                String courseName = input.next();
                int courseScore = input.nextInt();
                
                st.add(new Student(idNo, studentName, courseScore));
                sc.add(new Score(courseName, courseScore));
                
            }
            for (int i = 0; i < sc.size(); ++i) {
                String t = sc.get(i).getCourse();
                int val = sc.get(i).getScore();
                if (sumOfStudentScore.containsKey(t)) {
                    int res = sumOfStudentScore.get(t) + val;
                    sumOfStudentScore.put(t,  res);
                    res = numberOfStudentSelect.get(t) + 1;
                    numberOfStudentSelect.put(t, res);
                    
                    res = mx.get(t);  // 需要判断了才能使用
                    mx.put(t, Math.max(res, val));
                    res = mi.get(t);
                    mi.put(t, Math.min(res, val));
                } else {
                    sumOfStudentScore.put(t, val);
                    numberOfStudentSelect.put(t, 1);
                    mx.put(t, val);
                    mi.put(t, val);
                }
            }
    //        System.out.println("fff");
    //        for (String s : sumOfStudentScore.keySet()) {
    //            System.out.println(s + " " + sumOfStudentScore.get(s));
    //        }
            for (String s : sumOfStudentScore.keySet()) {
                System.out.println("课程: " + s + " 平均分是:" + sumOfStudentScore.get(s) * 1.0 / numberOfStudentSelect.get(s));
                System.out.println("其中最高分是:" + mx.get(s) + "  " + "最低分是:" + mi.get(s));
            }
            String idNo;
            System.out.println("请输入想要查询的学生成绩的id");
            idNo = input.next();
            for (int i = 0; i < st.size(); ++i) {
                if (st.get(i).getIdNo().compareTo(idNo) == 0) {
                    System.out.println(st.get(i).getScore());
                }
            }
        }
    }
    View Code

    泛型的使用方法

     
    public class Main {
        public static void main(String[] args) {
            PersonManager<Student> ps = new PersonManager<Student>();
            ps.add(new Student("2015", "liuweiming"));
            ps.add(new Student("2014", "liuhaha"));
            ps.findAll();
        }
    }
    
    
    
    public class Person {
        String idNo, name;
    }
    
    
    import java.util.*;
    public class PersonManager<T extends Person> {
        List<T> list;
        public PersonManager () {
            // TODO Auto-generated method stub
    //        System.out.println("fff");
            list = new ArrayList<T>();
        }
        
    //    public PersonManager<T> () {
    //        
    //    }
    
        public boolean add(T t) {
            if (list.contains(t)) return false;
            list.add(t);
            return true;
        }
        public boolean remove(T t) {
            if (!list.contains(t)) return false;
            list.remove(t);
            return true;
        }
        public T findById(int id) {
            for (T i : list) {
                if (i.getClass().isInstance(Student.class)) {
                    if (((Student)i).getIdNo().compareTo("" + id) == 0) {
                        return i;
                    }
                } else {
                    if (((Teacher)i).getIdNo().compareTo("" + id) == 0) {
                        return i;
                    }
                }
            }
            return list.get(0); //  wrong answer, 
        }
        public void findAll() {
            for (T i : list) {
                System.out.println(i.toString());
            }
        }
    }
    
    
    
    public class Student extends Person {
        String idNo, name;
    
        public String getIdNo() {
            return idNo;
        }
    
        public void setIdNo(String idNo) {
            this.idNo = idNo;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Student(String idNo, String name) {
            super();
            this.idNo = idNo;
            this.name = name;
        }
        @Override
        public String toString() {
            return idNo + " " + name;
        }
    }
    
    
    
    public class Teacher extends Person {
        String idNo, name;
    
        public String getIdNo() {
            return idNo;
        }
    
        public void setIdNo(String idNo) {
            this.idNo = idNo;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Teacher(String idNo, String name) {
            super();
            this.idNo = idNo;
            this.name = name;
        }
        @Override
        public String toString() {
            return idNo + " " + name;
        }
    }
    View Code

    2017年12月28日 20:30:05

    坑:

    如果一个方法里面有了 throws了东西,那么调用这个方法的时候就要try catch,或者在调用这个方法中的那个方法里面也throws东西。

    还有,要注意左边红色的错误啊。。。。

    java的web,服务器开了888端口,然后客户端要访问的也就是888端口。localhost就是127.0.0.1,不能写其他地址。写其他地址相当于访问别人的电脑了。

    那个getport,随机化的,不能setport啊。 socket.getPort()

    package liuweiming;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.io.Writer;
    import java.net.Inet4Address;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.*;
    
    import javax.sound.sampled.Port;
    
    class SocketHandler implements Runnable {
        private Socket socket;
        public SocketHandler(Socket socket) {
            this.socket = socket;
            // TODO Auto-generated constructor stub
        }
        public void run() {
            try {
                InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                String name = socket.getInetAddress().toString();
                name += ":";
                name += socket.getPort();
                System.out.println(name + " Say: " + bufferedReader.readLine());
                bufferedReader.close();
                inputStreamReader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }
    
    class ServerThread implements Runnable {
        
        public ServerThread() {
            
        }
        public void run() {
            try {
                ServerSocket serverSocket = new ServerSocket(888);
                while (true) {
                    Socket socket = serverSocket.accept(); // 等待接受
                    Thread thread = new Thread(new SocketHandler(socket));
                    thread.start();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }
    
    class Client {
        String inetAddress;
        int port;
        String fuck;
        public Client(String inetAddress, int port, String fuck) {
            this.inetAddress = inetAddress;
            this.port = port;
            this.fuck = fuck;
        }
        public void did() {
            Socket socket;
            try {
                socket = new Socket(inetAddress, port);
                
                PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
                printWriter.write(fuck);
                printWriter.flush();
                printWriter.close();
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Thread serverThread = new Thread(new ServerThread()); // 开启服务
            serverThread.start();
            
            Client client = new Client("127.0.0.1", 888, "df");
            client.did();
            Client client2 = new Client("127.0.0.1", 888, "fff");
            client2.did();
        }
    }
    View Code

    这次直接用浏览器做客户端,注意要加上一些话语才能show到去网页上。还有不知为何输出了两次(本地)

    感觉访问了两次一样因为那个socket.getPort()不同的。

    package liuweiming;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.io.Writer;
    import java.net.Inet4Address;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.*;
    
    import javax.sound.sampled.Port;
    
    class Sever {
        public void work() {
            try {
                ServerSocket serverSocket = new ServerSocket(8888); //监听这个端口
                while (true) { //一直accept
                    Socket socket = serverSocket.accept();
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String string = bufferedReader.readLine();
                    PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
                    System.out.println(socket.getInetAddress().toString() + "  " + socket.getPort() + " " + string);
                    
                    /*MK*/
                    printWriter.println("HTTP/1.1 200 OK");
                    printWriter.println("Content-Type: text/html;charset=UTF-8");
                    printWriter.println();
                    /*Mk*/
                    
                    printWriter.println("<p> fff </p>");
                    printWriter.flush();    
                    bufferedReader.close();
                    printWriter.close();
                    socket.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
            
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Sever sever = new Sever();
            sever.work();
            
        }
    }
    View Code

    算法复杂度分析,大O阶、小O,Ω、.....

    2018年1月3日 22:03:03

    如果TomCat不能用

    就在那个setclasspath.bat上,

    加上那两个即可

    如果想看看那个startup.bat为什么不行,可以在最后,也就是end;后面加上PAUSE让它停止。

  • 相关阅读:
    Luogu P4246 [SHOI2008]堵塞的交通(线段树+模拟)
    Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)
    Luogu P2042 [NOI2005]维护数列(平衡树)
    Luogu P1052 过河(dp)
    Luogu P1041 传染病控制(搜索)
    Luogu P2717 寒假作业(平衡树)
    Luogu P2822 组合数问题(前缀和)
    Luogu P2827 蚯蚓(模拟)
    随机图片测试
    Luogu P2458 [SDOI2006]保安站岗(树形dp)
  • 原文地址:https://www.cnblogs.com/liuweimingcprogram/p/7739943.html
Copyright © 2011-2022 走看看